diff --git a/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp b/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp index b02d5c58..a021a865 100644 --- a/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp +++ b/xo-interpreter2/src/interpreter2/VirtualSchematikaMachine.cpp @@ -918,21 +918,6 @@ namespace xo { // ----- primitive: cons() ----- - obj - xfer_cons(obj rcx, - obj car, - obj cdr) - { - (void)rcx; - - auto cdr_list = obj::from(cdr); - - return DList::cons(rcx.allocator(), - car, - cdr_list.data()); - } - - static DPrimitive_gco_2_gco_gco s_cons_pm("_cons", &xfer_cons); // ----- primitive: fn_n_args() ----- @@ -984,18 +969,6 @@ namespace xo { obj(&s_cwd_pm)); } - /* cons */ - { - const DUniqueString * name - = reader_.intern_string("cons"); - - global_env_->_upsert_value - (mm_.to_op(), - name, - Reflect::require(), - obj(&s_cons_pm)); - } - /* fn_n_args */ { const DUniqueString * name diff --git a/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp b/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp index 46cdf801..d02ad4aa 100644 --- a/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp +++ b/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp @@ -21,9 +21,12 @@ namespace xo { using AAllocator = xo::mm::AAllocator; public: - /** create primitive for fetching nth element of a sequence **/ + /** create primitive: fetch nth element of a sequence **/ static DPrimitive_gco_2_gco_gco * make_nth_pm(obj mm); + /** create primitive: create cons cell **/ + static DPrimitive_gco_2_gco_gco * make_cons_pm(obj mm); + /** create pirmitive for creating a dictionary instance **/ static DPrimitive_gco_0 * make_dict_make_pm(obj mm); diff --git a/xo-procedure2/src/procedure2/ObjectPrimitives.cpp b/xo-procedure2/src/procedure2/ObjectPrimitives.cpp index 98206d26..1cd00863 100644 --- a/xo-procedure2/src/procedure2/ObjectPrimitives.cpp +++ b/xo-procedure2/src/procedure2/ObjectPrimitives.cpp @@ -6,6 +6,7 @@ #include "ObjectPrimitives.hpp" #include #include +#include #include #include #include @@ -44,6 +45,28 @@ namespace xo { return DPrimitive_gco_2_gco_gco::_make(mm, "nth", &xfer_nth); } + // ----- cons ----- + + obj + xfer_cons(obj rcx, + obj car, + obj cdr) + { + (void)rcx; + + auto cdr_list = obj::from(cdr); + + return DList::cons(rcx.allocator(), + car, + cdr_list.data()); + } + + DPrimitive_gco_2_gco_gco * + ObjectPrimitives::make_cons_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "cons", &xfer_cons); + } + // ----- dict_make ----- obj diff --git a/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp b/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp index f0aa6f1b..c13dd4d3 100644 --- a/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp +++ b/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp @@ -62,6 +62,7 @@ namespace xo { bool ok = true; ok = ok & install_aux(sink, ObjectPrimitives::make_nth_pm(mm), flags); + 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);