diff --git a/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp b/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp index 6663538e..290eaf09 100644 --- a/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp +++ b/xo-interpreter2/include/xo/interpreter2/VirtualSchematikaMachine.hpp @@ -100,9 +100,6 @@ namespace xo { /** visit vsm-owned memory pools; call visitor(info) for each **/ void visit_pools(const MemorySizeVisitor & visitor) const; - /** install hardwired functions into global {symtab,env} **/ - void install_core_primitives(); - /** begin interactive session. **/ void begin_interactive_session(); /** begin batch session **/ diff --git a/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp b/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp index 74612aa6..d459622a 100644 --- a/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp +++ b/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp @@ -86,8 +86,6 @@ namespace xo { } this->global_env_ = reader_.global_env(); - - this->install_core_primitives(); } obj @@ -875,45 +873,6 @@ namespace xo { } } - // ----- primitive: fn_n_args() ----- - - obj - xfer_fn_n_args(obj rcx, - obj fn_gco) - { - scope log(XO_DEBUG(true)); - - log && log(xtag("fn_gco.tseq", fn_gco._typeseq())); - log && log(xtag("fn_gco.tname", TypeRegistry::id2name(fn_gco._typeseq()))); - - auto fn_proc = FacetRegistry::instance().try_variant(fn_gco); - - assert(fn_proc); - - return DInteger::box(rcx.allocator(), fn_proc.n_args()); - } - - static DPrimitive_gco_1_gco s_fn_n_args_pm("_fn_n_args", - &xfer_fn_n_args); - - // ----- install primitives ----- - - void - VirtualSchematikaMachine::install_core_primitives() - { - /* fn_n_args */ - { - const DUniqueString * name - = reader_.intern_string("fn_n_args"); - - global_env_->_upsert_value - (mm_.to_op(), - name, - Reflect::require(), - obj(&s_fn_n_args_pm)); - } - } - } /*namespace scm*/ } /*namespace xo*/ diff --git a/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp b/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp index ee2dfae0..1de2fd2d 100644 --- a/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp +++ b/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp @@ -6,6 +6,7 @@ #pragma once #include "Primitive_gco_0.hpp" +#include "Primitive_gco_1_gco.hpp" #include "Primitive_gco_2_gco_gco.hpp" #include "Primitive_gco_3_dict_string_gco.hpp" @@ -35,6 +36,9 @@ namespace xo { /** create primitive that upserts a key,value pair into a dictionary **/ static DPrimitive_gco_3_dict_string_gco * make_dict_upsert_pm(obj mm); + + /** create primitive: get fixed number of args for function **/ + static DPrimitive_gco_1_gco * make_fn_n_args_pm(obj mm); }; } /*namespace scm*/ diff --git a/xo-procedure2/src/procedure2/ObjectPrimitives.cpp b/xo-procedure2/src/procedure2/ObjectPrimitives.cpp index f5d7ab15..29e9e9bb 100644 --- a/xo-procedure2/src/procedure2/ObjectPrimitives.cpp +++ b/xo-procedure2/src/procedure2/ObjectPrimitives.cpp @@ -133,6 +133,30 @@ namespace xo { return DPrimitive_gco_3_dict_string_gco::_make(mm, "dict_upsert", &xfer_dict_upsert); } + // ----- fn_n_args ----- + + obj + xfer_fn_n_args(obj rcx, + obj fn_gco) + { + scope log(XO_DEBUG(true)); + + log && log(xtag("fn_gco.tseq", fn_gco._typeseq())); + log && log(xtag("fn_gco.tname", TypeRegistry::id2name(fn_gco._typeseq()))); + + auto fn_proc = FacetRegistry::instance().try_variant(fn_gco); + + assert(fn_proc); + + return DInteger::box(rcx.allocator(), fn_proc.n_args()); + } + + DPrimitive_gco_1_gco * + ObjectPrimitives::make_fn_n_args_pm(obj mm) + { + return DPrimitive_gco_1_gco::_make(mm, "fn_n_args", &xfer_fn_n_args); + } + } /*namespace scm*/ } /*namespace xo*/ diff --git a/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp b/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp index a5502d68..2585457b 100644 --- a/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp +++ b/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp @@ -66,6 +66,7 @@ namespace xo { ok = ok & install_aux(sink, ObjectPrimitives::make_cons_pm(mm), flags); ok = ok & install_aux(sink, ObjectPrimitives::make_dict_make_pm(mm), flags); ok = ok & install_aux(sink, ObjectPrimitives::make_dict_upsert_pm(mm), flags); + ok = ok & install_aux(sink, ObjectPrimitives::make_fn_n_args_pm(mm), flags); return ok; }