xo-interpreter2 stack: + more primitive function-type decoration

This commit is contained in:
Roland Conybeare 2026-03-16 12:34:59 -05:00
commit 7bfe5d9586
8 changed files with 76 additions and 22 deletions

View file

@ -18,7 +18,8 @@ namespace xo {
public:
/** create primitive: report memory use to console **/
static DPrimitive_gco_0 * make_report_memory_use_pm(obj<AAllocator> mm);
static DPrimitive_gco_0 * make_report_memory_use_pm(obj<AAllocator> mm,
StringTable * stbl);
};
} /*namespace scm*/

View file

@ -6,6 +6,8 @@
#include "VsmPrimitives.hpp"
#include <xo/numeric/NumericDispatch.hpp>
#include <xo/object2/Boolean.hpp>
#include <xo/type/AtomicType.hpp>
#include <xo/type/FunctionType.hpp>
namespace xo {
//using xo::scm::NumericDispatch;
@ -38,10 +40,18 @@ namespace xo {
}
DPrimitive_gco_0 *
VsmPrimitives::make_report_memory_use_pm(obj<AAllocator> mm)
VsmPrimitives::make_report_memory_use_pm(obj<AAllocator> mm,
StringTable * stbl)
{
(void)stbl;
auto bool_ty = DAtomicType::make(mm, Metatype::t_bool());
// report_memory_use: () -> bool
auto pm_ty = obj<AType,DFunctionType>(DFunctionType::_make(mm, bool_ty));
return DPrimitive_gco_0::_make(mm,
"report_memory_use",
pm_ty,
&xfer_report_memory_use);
}

View file

@ -56,13 +56,11 @@ namespace xo {
InstallSink sink,
InstallFlags flags)
{
(void)stbl;
scope log(XO_DEBUG(true));
bool ok = true;
ok = ok & install_aux(sink, VsmPrimitives::make_report_memory_use_pm(mm), flags);
ok = ok & install_aux(sink, VsmPrimitives::make_report_memory_use_pm(mm, stbl), flags);
return ok;
}

View file

@ -40,13 +40,16 @@ namespace xo {
StringTable * stbl);
/** create primitive for creating a dictionary instance **/
static DPrimitive_gco_2_dict_string * make_dict_lookup_pm(obj<AAllocator> mm);
static DPrimitive_gco_2_dict_string * make_dict_lookup_pm(obj<AAllocator> mm,
StringTable * stbl);
/** create primitive that upserts a key,value pair into a dictionary **/
static DPrimitive_gco_3_dict_string_gco * make_dict_upsert_pm(obj<AAllocator> mm);
static DPrimitive_gco_3_dict_string_gco * make_dict_upsert_pm(obj<AAllocator> mm,
StringTable * stbl);
/** create primitive: get fixed number of args for function **/
static DPrimitive_gco_1_gco * make_fn_n_args_pm(obj<AAllocator> mm);
static DPrimitive_gco_1_gco * make_fn_n_args_pm(obj<AAllocator> mm,
StringTable * stbl);
};
} /*namespace scm*/

View file

@ -163,9 +163,21 @@ namespace xo {
}
DPrimitive_gco_2_dict_string *
ObjectPrimitives::make_dict_lookup_pm(obj<AAllocator> mm)
ObjectPrimitives::make_dict_lookup_pm(obj<AAllocator> mm,
StringTable * stbl)
{
return DPrimitive_gco_2_dict_string::_make(mm, "dict_lookup", &xfer_dict_lookup);
(void)stbl;
// dict_ty: generic dictionary
auto dict_ty = DAtomicType::make(mm, Metatype::t_dict());
auto str_ty = DAtomicType::make(mm, Metatype::t_str());
auto any_ty = DAtomicType::make(mm, Metatype::t_any());
// pm_ty: dict x string -> any
auto pm_ty = obj<AType,DFunctionType>
(DFunctionType::_make(mm, any_ty, dict_ty, str_ty));
return DPrimitive_gco_2_dict_string::_make
(mm, "dict_lookup", pm_ty, &xfer_dict_lookup);
}
// ----- dict_upsert -----
@ -196,9 +208,23 @@ namespace xo {
}
DPrimitive_gco_3_dict_string_gco *
ObjectPrimitives::make_dict_upsert_pm(obj<AAllocator> mm)
ObjectPrimitives::make_dict_upsert_pm(obj<AAllocator> mm,
StringTable * stbl)
{
return DPrimitive_gco_3_dict_string_gco::_make(mm, "dict_upsert", &xfer_dict_upsert);
(void)stbl;
auto dict_ty = DAtomicType::make(mm, Metatype::t_dict());
auto str_ty = DAtomicType::make(mm, Metatype::t_str());
auto any_ty = DAtomicType::make(mm, Metatype::t_any());
// pm_ty: dict x string x any -> dict
auto pm_ty = obj<AType,DFunctionType>(DFunctionType::_make(mm,
dict_ty,
dict_ty,
str_ty,
any_ty));
return DPrimitive_gco_3_dict_string_gco::_make
(mm, "dict_upsert", pm_ty, &xfer_dict_upsert);
}
// ----- fn_n_args -----
@ -220,9 +246,18 @@ namespace xo {
}
DPrimitive_gco_1_gco *
ObjectPrimitives::make_fn_n_args_pm(obj<AAllocator> mm)
ObjectPrimitives::make_fn_n_args_pm(obj<AAllocator> mm,
StringTable * stbl)
{
return DPrimitive_gco_1_gco::_make(mm, "fn_n_args", &xfer_fn_n_args);
(void)stbl;
auto integer_ty = DAtomicType::make(mm, Metatype::t_integer());
auto callable_ty = DAtomicType::make(mm, Metatype::t_callable());
auto pm_ty = obj<AType,DFunctionType>(DFunctionType::_make(mm,
integer_ty,
callable_ty));
return DPrimitive_gco_1_gco::_make(mm, "fn_n_args", pm_ty, &xfer_fn_n_args);
}
} /*namespace scm*/

View file

@ -62,13 +62,13 @@ 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), flags);
ok = ok & install_aux(sink, ObjectPrimitives::make_dict_upsert_pm(mm), flags);
ok = ok & install_aux(sink, ObjectPrimitives::make_fn_n_args_pm(mm), flags);
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);
return ok;
}

View file

@ -48,6 +48,9 @@ namespace xo {
/** any numeric type: i16|i32|i64|f32|f64 **/
t_numeric,
/** any callable type (e.g. all function types) **/
t_callable,
/* any type at all */
t_any,
};
@ -71,10 +74,11 @@ namespace xo {
static Metatype t_array() { return Metatype(code::t_array); }
static Metatype t_function() { return Metatype(code::t_function); }
static Metatype t_struct() { return Metatype(code::t_struct); }
static Metatype t_dict() { return Metatype(code::t_dict); }
static Metatype t_dict() { return Metatype(code::t_dict); }
static Metatype t_integer() { return Metatype(code::t_integer); }
static Metatype t_numeric() { return Metatype(code::t_numeric); }
static Metatype t_callable() { return Metatype(code::t_callable); }
static Metatype t_any() { return Metatype(code::t_any); }
/** description string for this type category **/

View file

@ -32,6 +32,7 @@ namespace xo {
case code::t_integer: return "integer";
case code::t_numeric: return "numeric";
case code::t_callable: return "callable";
case code::t_any: return "any";
}
}
@ -77,6 +78,8 @@ namespace xo {
return true;
case code::t_numeric:
return true;
case code::t_callable:
return true;
case code::t_any:
return true;
}