mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-07-31 00:37:02 +08:00
Separate system-level options (No_Load_Modules, Load_Modules, No_External_Scripts, External_Scripts) from library-level options (No_Stdlib, No_IO, No_Prelude, No_JSON) into two distinct enum types. Add Library_Options as a parameter to the ChaiScript constructor. Update tests to demonstrate both ChaiScript_Basic (explicit Std_Lib::library call) and ChaiScript (library options via constructor parameter) usage. Requested by @lefticus in PR #642 review. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
80 lines
2.6 KiB
C++
80 lines
2.6 KiB
C++
// This file is distributed under the BSD License.
|
|
// See "license.txt" for details.
|
|
// Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com)
|
|
// and Jason Turner (jason@emptycrate.com)
|
|
// http://www.chaiscript.com
|
|
|
|
#ifndef CHAISCRIPT_STDLIB_HPP_
|
|
#define CHAISCRIPT_STDLIB_HPP_
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "chaiscript_defines.hpp"
|
|
#include "language/chaiscript_common.hpp"
|
|
|
|
#include "dispatchkit/function_call.hpp"
|
|
|
|
//#include "dispatchkit/dispatchkit.hpp"
|
|
#include "dispatchkit/bootstrap.hpp"
|
|
#include "dispatchkit/bootstrap_stl.hpp"
|
|
#include "dispatchkit/operators.hpp"
|
|
//#include "dispatchkit/boxed_value.hpp"
|
|
#include "dispatchkit/register_function.hpp"
|
|
#include "language/chaiscript_prelude.hpp"
|
|
#include "utility/json_wrap.hpp"
|
|
|
|
#ifndef CHAISCRIPT_NO_THREADS
|
|
#include <future>
|
|
#endif
|
|
|
|
/// @file
|
|
///
|
|
/// This file generates the standard library that normal ChaiScript usage requires.
|
|
|
|
namespace chaiscript {
|
|
class Std_Lib {
|
|
public:
|
|
[[nodiscard]] static ModulePtr library(const std::vector<Library_Options> &t_opts = {}) {
|
|
if (std::find(t_opts.begin(), t_opts.end(), Library_Options::No_Stdlib) != t_opts.end()) {
|
|
return std::make_shared<Module>();
|
|
}
|
|
|
|
auto lib = std::make_shared<Module>();
|
|
|
|
const bool no_io = std::find(t_opts.begin(), t_opts.end(), Library_Options::No_IO) != t_opts.end();
|
|
const bool no_prelude = std::find(t_opts.begin(), t_opts.end(), Library_Options::No_Prelude) != t_opts.end();
|
|
const bool no_json = std::find(t_opts.begin(), t_opts.end(), Library_Options::No_JSON) != t_opts.end();
|
|
|
|
bootstrap::Bootstrap::bootstrap(*lib, no_io);
|
|
|
|
bootstrap::standard_library::vector_type<std::vector<Boxed_Value>>("Vector", *lib);
|
|
bootstrap::standard_library::string_type<std::string>("string", *lib);
|
|
bootstrap::standard_library::map_type<std::map<std::string, Boxed_Value>>("Map", *lib);
|
|
bootstrap::standard_library::pair_type<std::pair<Boxed_Value, Boxed_Value>>("Pair", *lib);
|
|
|
|
#ifndef CHAISCRIPT_NO_THREADS
|
|
bootstrap::standard_library::future_type<std::future<chaiscript::Boxed_Value>>("future", *lib);
|
|
lib->add(chaiscript::fun(
|
|
[](const std::function<chaiscript::Boxed_Value()> &t_func) { return std::async(std::launch::async, t_func); }),
|
|
"async");
|
|
#endif
|
|
|
|
if (!no_json) {
|
|
json_wrap::library(*lib);
|
|
}
|
|
|
|
if (!no_prelude) {
|
|
lib->eval(ChaiScript_Prelude::chaiscript_prelude() /*, "standard prelude"*/);
|
|
}
|
|
|
|
return lib;
|
|
}
|
|
};
|
|
} // namespace chaiscript
|
|
|
|
#endif
|