From 1ec0d042d1d116108a6b07b0784950a91e9a590d Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 24 Mar 2026 22:17:41 -0400 Subject: [PATCH] xo-procedure2: + assign_head + set-car pm impl [WIP] Not actuall installed in global env --- include/xo/procedure2/ObjectPrimitives.hpp | 4 ++ src/procedure2/ObjectPrimitives.cpp | 43 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/xo/procedure2/ObjectPrimitives.hpp b/include/xo/procedure2/ObjectPrimitives.hpp index c403dc1..87a8045 100644 --- a/include/xo/procedure2/ObjectPrimitives.hpp +++ b/include/xo/procedure2/ObjectPrimitives.hpp @@ -35,6 +35,10 @@ namespace xo { static DPrimitive_gco_2_gco_gco * make_cons_pm(obj mm, StringTable * stbl); + /** create primitive: set first member of cons cell **/ + static DPrimitive_gco_2_gco_gco * make_set_car_pm(obj mm, + StringTable * stbl); + /** create primitive for creating a dictionary instance **/ static DPrimitive_gco_0 * make_dict_make_pm(obj mm, StringTable * stbl); diff --git a/src/procedure2/ObjectPrimitives.cpp b/src/procedure2/ObjectPrimitives.cpp index d9d86f4..36dd2a3 100644 --- a/src/procedure2/ObjectPrimitives.cpp +++ b/src/procedure2/ObjectPrimitives.cpp @@ -116,6 +116,48 @@ namespace xo { return DPrimitive_gco_2_gco_gco::_make(mm, "cons", cons_ty, &xfer_cons); } + // ----- set-car ----- + + obj + xfer_set_car(obj rcx, + obj cell_arg, + obj dest) + { + scope log(XO_DEBUG(true)); + + (void)rcx; + (void)dest; + + auto cell = obj::from(cell_arg); + + assert(!cell->is_empty()); + + if (!cell->is_empty()) { + cell->assign_head(rcx.collector(), dest); + } + + return cell; + } + + DPrimitive_gco_2_gco_gco * + ObjectPrimitives::make_set_car_pm(obj mm, + StringTable * stbl) + { + (void)stbl; + + auto any_ty = DAtomicType::make(mm, Metatype::t_any()); + auto T_ty = DTypeVarRef::make(mm, stbl->intern("T")); + auto list_T_ty = DListType::make(mm, T_ty); + /** pm_ty: list x any -> list **/ + auto pm_ty + = obj(DFunctionType::_make(mm, + list_T_ty, + any_ty, + list_T_ty)); + + return DPrimitive_gco_2_gco_gco::_make(mm, "set-car", pm_ty, &xfer_set_car); + } + // ----- dict_make ----- obj @@ -233,6 +275,7 @@ namespace xo { xfer_fn_n_args(obj rcx, obj fn_gco) { + scope log(XO_DEBUG(true)); log && log(xtag("fn_gco.tseq", fn_gco._typeseq()));