mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-05-01 03:19:28 +08:00
* Fix #146: Add configuration options to selectively disable built-in functions 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> * Address review: split Options into Options and Library_Options enums 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> * Add cheatsheet documentation for Options and Library_Options Documents the two-enum configuration system: Options (engine-level: load_module, use, eval_file) and Library_Options (stdlib-level: No_Stdlib, No_IO, No_Prelude, No_JSON), with usage examples for both ChaiScript and ChaiScript_Basic constructors. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: leftibot <leftibot@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
79 lines
2.5 KiB
C++
79 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<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);
|
|
// Note: async() is registered in ChaiScript_Basic::build_eval_system()
|
|
// with thread tracking to prevent heap-use-after-free on engine destruction.
|
|
#endif
|
|
|
|
if (!no_json) {
|
|
json_wrap::library(*lib);
|
|
}
|
|
|
|
if (!no_prelude) {
|
|
lib->eval(ChaiScript_Prelude::chaiscript_prelude() /*, "standard prelude"*/);
|
|
}
|
|
|
|
return lib;
|
|
}
|
|
};
|
|
} // namespace chaiscript
|
|
|
|
#endif
|