From 9c2a817eb360cd7beca539111dcbc4cc9be05d4d Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Mon, 16 Mar 2026 20:12:19 -0500 Subject: [PATCH] xo-procedure2: simplify primitive install --- include/xo/procedure2/PrimitiveRegistry.hpp | 23 ++++++- src/procedure2/SetupProcedure2.cpp | 73 ++++++++------------- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/include/xo/procedure2/PrimitiveRegistry.hpp b/include/xo/procedure2/PrimitiveRegistry.hpp index dd4e70b..c5227ec 100644 --- a/include/xo/procedure2/PrimitiveRegistry.hpp +++ b/include/xo/procedure2/PrimitiveRegistry.hpp @@ -34,8 +34,6 @@ namespace xo { return InstallFlags(static_cast(x) & static_cast(y)); } - - /** provided by VSM to receive created primitives. * InstallSink(pm) adopts a primitive **/ @@ -70,6 +68,26 @@ namespace xo { /** singleton instance **/ static PrimitiveRegistry & instance(); + template + static bool install_aux(InstallSink sink, + PrimitiveRepr * pm, + InstallFlags flags) { + scope log(XO_DEBUG(true)); + + if (flags != InstallFlags::f_none) { + 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; + } + } + /** remember primitive-factory @p source_fn **/ void register_primitives(InstallSource source_fn); @@ -83,6 +101,7 @@ namespace xo { InstallSink sink, InstallFlags flags); + private: /** a set of factories that create primitives **/ std::vector init_seq_v_; diff --git a/src/procedure2/SetupProcedure2.cpp b/src/procedure2/SetupProcedure2.cpp index a31964a..60bd02e 100644 --- a/src/procedure2/SetupProcedure2.cpp +++ b/src/procedure2/SetupProcedure2.cpp @@ -84,44 +84,6 @@ namespace xo { return ok; } - 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 SetupProcedure2::register_primitives(obj rcx, InstallSink sink, @@ -134,13 +96,34 @@ namespace xo { bool ok = true; - ok = ok & install_aux(sink, ObjectPrimitives::make_cwd_pm (mm, stbl), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_nth_pm (mm, stbl), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_cons_pm (mm, stbl), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_dict_make_pm (mm, stbl), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_dict_lookup_pm (mm, stbl), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_dict_upsert_pm (mm, stbl), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_fn_n_args_pm (mm, stbl), flags); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + ObjectPrimitives::make_cwd_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + ObjectPrimitives::make_nth_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + ObjectPrimitives::make_cons_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + ObjectPrimitives::make_dict_make_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + ObjectPrimitives::make_dict_lookup_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + ObjectPrimitives::make_dict_upsert_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); + ok = ok & (PrimitiveRegistry::install_aux + (sink, + ObjectPrimitives::make_fn_n_args_pm(mm, stbl), + flags & InstallFlags::f_generalpurpose)); return ok; }