From 1305788778c35430d0998a0265f2b5de925bfc99 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 11 Mar 2026 15:40:38 -0500 Subject: [PATCH] xo-interpreter2 stack: + nth() primitive --- src/interpreter2/VirtualSchematikaMachine.cpp | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/interpreter2/VirtualSchematikaMachine.cpp b/src/interpreter2/VirtualSchematikaMachine.cpp index d0889fa3..8807a72c 100644 --- a/src/interpreter2/VirtualSchematikaMachine.cpp +++ b/src/interpreter2/VirtualSchematikaMachine.cpp @@ -5,6 +5,7 @@ #include "VirtualSchematikaMachine.hpp" #include "DPrimitive_gco_3_dict_string_gco.hpp" +#include "DPrimitive_gco_2_gco_gco.hpp" #include "VsmDefContFrame.hpp" #include "VsmApplyFrame.hpp" #include "VsmEvalArgsFrame.hpp" @@ -13,6 +14,7 @@ #include "VsmSeqContFrame.hpp" #include "VsmRcx.hpp" #include "Closure.hpp" +#include #include #include #include @@ -25,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -911,6 +914,26 @@ namespace xo { static DPrimitive_gco_0 s_cwd_pm("_cwd", &xfer_cwd); + // ----- primitive: fn_nth() ----- + + // TODO: seq_gc -> obj + // n_gco -> obj + // + obj + xfer_nth(obj rcx, + obj seq_gco, + obj n_gco) + { + (void)rcx; + + obj seq = seq_gco.to_facet(); + auto n = obj::from(n_gco); + + return seq.at(n->value()); + } + + static DPrimitive_gco_2_gco_gco s_nth_pm("_nth", &xfer_nth); + // ----- primitive: fn_n_args() ----- obj @@ -1003,6 +1026,18 @@ namespace xo { obj(&s_cwd_pm)); } + /* nth */ + { + const DUniqueString * name + = reader_.intern_string("nth"); + + global_env_->_upsert_value + (mm_.to_op(), + name, + Reflect::require(), + obj(&s_nth_pm)); + } + /* fn_n_args */ { const DUniqueString * name