mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-07-31 00:37:02 +08:00
Add new Options enum values (No_Stdlib, No_IO, No_Prelude, No_JSON) that allow users to control which parts of the standard library are registered. Std_Lib::library() now accepts an options vector, and the ChaiScript convenience class forwards its options to the library builder. This enables use cases where only custom functions should be exposed to script users. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
80 lines
2.5 KiB
C++
80 lines
2.5 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<Options> &t_opts = {}) {
|
|
if (std::find(t_opts.begin(), t_opts.end(), 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(), Options::No_IO) != t_opts.end();
|
|
const bool no_prelude = std::find(t_opts.begin(), t_opts.end(), Options::No_Prelude) != t_opts.end();
|
|
const bool no_json = std::find(t_opts.begin(), t_opts.end(), 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
|