From 6d6066995a900405464824141d8a39aaa82f1d08 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Sun, 15 Mar 2026 09:47:14 -0500 Subject: [PATCH] xo-interpreter2 stack: modularize nth() primitive setup/install --- include/xo/procedure2/DPrimitive.hpp | 1 + include/xo/procedure2/ObjectPrimitives.hpp | 29 ++++++++ .../procedure2_register_primitives.hpp | 6 +- src/procedure2/CMakeLists.txt | 2 + src/procedure2/ObjectPrimitives.cpp | 45 ++++++++++++ src/procedure2/init_procedure2.cpp | 4 + .../procedure2_register_primitives.cpp | 73 +++++++++++++++++++ 7 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 include/xo/procedure2/ObjectPrimitives.hpp create mode 100644 src/procedure2/ObjectPrimitives.cpp create mode 100644 src/procedure2/procedure2_register_primitives.cpp diff --git a/include/xo/procedure2/DPrimitive.hpp b/include/xo/procedure2/DPrimitive.hpp index 4cc45f8..07c19c4 100644 --- a/include/xo/procedure2/DPrimitive.hpp +++ b/include/xo/procedure2/DPrimitive.hpp @@ -72,6 +72,7 @@ namespace xo { template class Primitive { public: + using FunctionPtrType = Fn; using Traits = detail::PmFnTraits; using ACollector = xo::mm::ACollector; diff --git a/include/xo/procedure2/ObjectPrimitives.hpp b/include/xo/procedure2/ObjectPrimitives.hpp new file mode 100644 index 0000000..392cf93 --- /dev/null +++ b/include/xo/procedure2/ObjectPrimitives.hpp @@ -0,0 +1,29 @@ +/** @file ObjectPrimitives.hpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#pragma once + +#include + +namespace xo { + namespace scm { + /** @brief primitives centered on object2/ data structures. + * + * Note: they don't reside in object2/ because DPrimitive + * not available yet at that level + **/ + class ObjectPrimitives { + public: + using AAllocator = xo::mm::AAllocator; + + public: + /** create primitive for fetching nth element of a sequence **/ + static DPrimitive_gco_2_gco_gco * make_nth_pm(obj mm); + }; + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end ObjectPrimitives.hpp */ diff --git a/include/xo/procedure2/procedure2_register_primitives.hpp b/include/xo/procedure2/procedure2_register_primitives.hpp index 12e1db9..6923769 100644 --- a/include/xo/procedure2/procedure2_register_primitives.hpp +++ b/include/xo/procedure2/procedure2_register_primitives.hpp @@ -10,8 +10,10 @@ namespace xo { namespace scm { - /** Register gc-aware (AGCObject,DRepr) combinations with garbage collector @p gc **/ - bool procedure2_register_primitives(obj gc, InstallSink sink); + /** Register primitive-factories **/ + bool procedure2_register_primitives(obj gc, + InstallSink sink, + InstallFlags flags); } } diff --git a/src/procedure2/CMakeLists.txt b/src/procedure2/CMakeLists.txt index 9e1af2c..f38ea2f 100644 --- a/src/procedure2/CMakeLists.txt +++ b/src/procedure2/CMakeLists.txt @@ -4,8 +4,10 @@ set(SELF_LIB xo_procedure2) set(SELF_SRCS init_procedure2.cpp init_primitives.cpp + procedure2_register_primitives.cpp procedure2_register_types.cpp procedure2_register_facets.cpp + ObjectPrimitives.cpp PrimitiveRegistry.cpp DPrimitive.cpp DSimpleRcx.cpp diff --git a/src/procedure2/ObjectPrimitives.cpp b/src/procedure2/ObjectPrimitives.cpp new file mode 100644 index 0000000..5164efc --- /dev/null +++ b/src/procedure2/ObjectPrimitives.cpp @@ -0,0 +1,45 @@ +/** @file ObjectPrimitives.cpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#include "ObjectPrimitives.hpp" +#include "Primitive_gco_2_gco_gco.hpp" +#include +#include + +namespace xo { + using xo::scm::ASequence; + using xo::mm::AAllocator; + using xo::mm::AGCObject; + + namespace scm { + + // TODO: seq_gc -> obj + // n_gco -> obj + // + obj + xfer_nth(obj rcx, + obj seq_gco, + obj n_gco) + { + scope log(XO_DEBUG(true)); + + (void)rcx; + + obj seq = seq_gco.to_facet(); + auto n = obj::from(n_gco); + + return seq.at(n->value()); + } + + DPrimitive_gco_2_gco_gco * + ObjectPrimitives::make_nth_pm(obj mm) + { + return DPrimitive_gco_2_gco_gco::_make(mm, "nth", &xfer_nth); + } + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end ObjectPrimitives.cpp */ diff --git a/src/procedure2/init_procedure2.cpp b/src/procedure2/init_procedure2.cpp index bc7e53a..d202931 100644 --- a/src/procedure2/init_procedure2.cpp +++ b/src/procedure2/init_procedure2.cpp @@ -7,6 +7,7 @@ #include "init_primitives.hpp" #include "procedure2_register_facets.hpp" #include "procedure2_register_types.hpp" +#include "procedure2_register_primitives.hpp" #include #include @@ -14,6 +15,8 @@ namespace xo { using xo::scm::procedure2_register_facets; using xo::scm::procedure2_register_types; + using xo::scm::procedure2_register_primitives; + using xo::scm::PrimitiveRegistry; using xo::mm::CollectorTypeRegistry; void @@ -22,6 +25,7 @@ namespace xo { procedure2_register_facets(); CollectorTypeRegistry::instance().register_types(&procedure2_register_types); + PrimitiveRegistry::instance().register_primitives(&procedure2_register_primitives); } InitEvidence diff --git a/src/procedure2/procedure2_register_primitives.cpp b/src/procedure2/procedure2_register_primitives.cpp new file mode 100644 index 0000000..e17cda4 --- /dev/null +++ b/src/procedure2/procedure2_register_primitives.cpp @@ -0,0 +1,73 @@ +/** @file procedure2_register_primitives.cpp + * + * @author Roland Conybeare, Mar 2026 + **/ + +#include "procedure2_register_primitives.hpp" +#include "ObjectPrimitives.hpp" +#include "Primitive_gco_2_gco_gco.hpp" +#include +#include + +namespace xo { + using xo::scm::ASequence; + using xo::mm::AAllocator; + using xo::mm::AGCObject; + + namespace scm { + template + bool install_aux(InstallSink sink, + PrimitiveRepr * pm, + InstallFlags flags) + { + scope log(XO_DEBUG(true)); + + if ((flags & InstallFlags::f_generalpurpose) == InstallFlags::f_generalpurpose) { + log && log("create primitive", xtag("name", pm->name())); + + return sink(pm->name(), + pm->fn_td(), + obj(pm), + flags); + } else { + log && log("skip primitive", xtag("name", pm->name())); + + return true; + } + } + + template + bool install_aux(InstallSink sink, + obj mm, + std::string_view name, + typename Primitive::FunctionPtrType impl, + InstallFlags flags) + { + if (flags != InstallFlags::f_none) { + auto pm + = Primitive::_make(mm, name, impl); + + return install_aux(sink, pm, flags); + } else { + return true; + } + } + + bool + procedure2_register_primitives(obj mm, + InstallSink sink, + InstallFlags flags) + { + scope log(XO_DEBUG(true)); + + bool ok = true; + + ok = ok & install_aux(sink, ObjectPrimitives::make_nth_pm(mm), flags); + + return ok; + } + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end procedure2_register_primitives.cpp */