diff --git a/xo-interpreter2/include/xo/interpreter2/interpreter2_register_primitives.hpp b/xo-interpreter2/include/xo/interpreter2/interpreter2_register_primitives.hpp index 1946969a..5d3f0fb1 100644 --- a/xo-interpreter2/include/xo/interpreter2/interpreter2_register_primitives.hpp +++ b/xo-interpreter2/include/xo/interpreter2/interpreter2_register_primitives.hpp @@ -12,6 +12,7 @@ namespace xo { namespace scm { /** Register primitive-factories **/ bool interpreter2_register_primitives(obj gc, + StringTable * stbl, InstallSink sink, InstallFlags flags); } diff --git a/xo-interpreter2/src/interpreter2/interpreter2_register_primitives.cpp b/xo-interpreter2/src/interpreter2/interpreter2_register_primitives.cpp index 17512f4b..9b165b17 100644 --- a/xo-interpreter2/src/interpreter2/interpreter2_register_primitives.cpp +++ b/xo-interpreter2/src/interpreter2/interpreter2_register_primitives.cpp @@ -52,12 +52,11 @@ namespace xo { bool interpreter2_register_primitives(obj mm, + StringTable * stbl, InstallSink sink, InstallFlags flags) { - (void)mm; - (void)sink; - (void)flags; + (void)stbl; scope log(XO_DEBUG(true)); diff --git a/xo-numeric/include/xo/numeric/numeric_register_primitives.hpp b/xo-numeric/include/xo/numeric/numeric_register_primitives.hpp index 18a594be..c4b0bd7b 100644 --- a/xo-numeric/include/xo/numeric/numeric_register_primitives.hpp +++ b/xo-numeric/include/xo/numeric/numeric_register_primitives.hpp @@ -12,6 +12,7 @@ namespace xo { namespace scm { /** Register primitive factories with primitive registry **/ bool numeric_register_primitives(obj mm, + StringTable * stbl, InstallSink sink, InstallFlags flags); } diff --git a/xo-numeric/src/numeric/numeric_register_primitives.cpp b/xo-numeric/src/numeric/numeric_register_primitives.cpp index b2da4d9e..aa4a24d0 100644 --- a/xo-numeric/src/numeric/numeric_register_primitives.cpp +++ b/xo-numeric/src/numeric/numeric_register_primitives.cpp @@ -49,8 +49,11 @@ namespace xo { } bool - numeric_register_primitives(obj mm, InstallSink sink, InstallFlags flags) + numeric_register_primitives(obj mm, StringTable * stbl, + InstallSink sink, InstallFlags flags) { + (void)stbl; + scope log(XO_DEBUG(true)); bool ok = true; diff --git a/xo-object2/include/xo/object2/DArray.hpp b/xo-object2/include/xo/object2/DArray.hpp index 55d5e068..332d126a 100644 --- a/xo-object2/include/xo/object2/DArray.hpp +++ b/xo-object2/include/xo/object2/DArray.hpp @@ -72,7 +72,7 @@ namespace xo { * Darray * v = DArray::array(mm, e1, e2, e3); **/ template - requires (std::same_as> && ...) + requires (std::convertible_to> && ...) static DArray * array(obj mm, Args... args); ///@} @@ -170,7 +170,7 @@ namespace xo { }; template - requires (std::same_as> && ...) + requires (std::convertible_to> && ...) DArray * DArray::array(obj mm, Args... args) { diff --git a/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp b/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp index 2fc31766..696fc295 100644 --- a/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp +++ b/xo-procedure2/include/xo/procedure2/ObjectPrimitives.hpp @@ -24,16 +24,20 @@ namespace xo { public: /** create primitive: report current working directory **/ - static DPrimitive_gco_0 * make_cwd_pm(obj mm); + static DPrimitive_gco_0 * make_cwd_pm(obj mm, + StringTable * stbl); /** create primitive: fetch nth element of a sequence **/ - static DPrimitive_gco_2_gco_gco * make_nth_pm(obj mm); + static DPrimitive_gco_2_gco_gco * make_nth_pm(obj mm, + StringTable * stbl); /** create primitive: create cons cell **/ - static DPrimitive_gco_2_gco_gco * make_cons_pm(obj mm); + static DPrimitive_gco_2_gco_gco * make_cons_pm(obj mm, + StringTable * stbl); /** create primitive for creating a dictionary instance **/ - static DPrimitive_gco_0 * make_dict_make_pm(obj mm); + static DPrimitive_gco_0 * make_dict_make_pm(obj mm, + StringTable * stbl); /** create primitive for creating a dictionary instance **/ static DPrimitive_gco_2_dict_string * make_dict_lookup_pm(obj mm); diff --git a/xo-procedure2/include/xo/procedure2/PrimitiveRegistry.hpp b/xo-procedure2/include/xo/procedure2/PrimitiveRegistry.hpp index 6f1f67ea..a4e24e2a 100644 --- a/xo-procedure2/include/xo/procedure2/PrimitiveRegistry.hpp +++ b/xo-procedure2/include/xo/procedure2/PrimitiveRegistry.hpp @@ -61,6 +61,7 @@ namespace xo { * to InstallSink sink. **/ using InstallSource = std::function mm, + StringTable * stbl, InstallSink sink, InstallFlags flags)>; @@ -72,9 +73,11 @@ namespace xo { void register_primitives(InstallSource source_fn); /** create primitives using memory from @p mm, + * with global strings in @p stbl. * delivering each primitive to @p sink. **/ bool install_primitives(obj mm, + StringTable * stbl, InstallSink sink, InstallFlags flags); diff --git a/xo-procedure2/include/xo/procedure2/procedure2_register_primitives.hpp b/xo-procedure2/include/xo/procedure2/procedure2_register_primitives.hpp index 69237697..396f645f 100644 --- a/xo-procedure2/include/xo/procedure2/procedure2_register_primitives.hpp +++ b/xo-procedure2/include/xo/procedure2/procedure2_register_primitives.hpp @@ -12,6 +12,7 @@ namespace xo { namespace scm { /** Register primitive-factories **/ bool procedure2_register_primitives(obj gc, + StringTable * stbl, InstallSink sink, InstallFlags flags); } diff --git a/xo-procedure2/src/procedure2/ObjectPrimitives.cpp b/xo-procedure2/src/procedure2/ObjectPrimitives.cpp index c247ab8c..d52c5304 100644 --- a/xo-procedure2/src/procedure2/ObjectPrimitives.cpp +++ b/xo-procedure2/src/procedure2/ObjectPrimitives.cpp @@ -9,6 +9,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include // for getcwd() @@ -35,9 +39,15 @@ namespace xo { } DPrimitive_gco_0 * - ObjectPrimitives::make_cwd_pm(obj mm) + ObjectPrimitives::make_cwd_pm(obj mm, StringTable * stbl) { - return DPrimitive_gco_0::_make(mm, "cwd", &xfer_cwd); + (void)stbl; + + auto str_ty = DAtomicType::make(mm, Metatype::t_str()); + auto cwd_ty + = obj(DFunctionType::_make(mm, str_ty)); + + return DPrimitive_gco_0::_make(mm, "cwd", cwd_ty, &xfer_cwd); } // ----- nth ----- @@ -59,9 +69,20 @@ namespace xo { } DPrimitive_gco_2_gco_gco * - ObjectPrimitives::make_nth_pm(obj mm) + ObjectPrimitives::make_nth_pm(obj mm, StringTable * stbl) { - return DPrimitive_gco_2_gco_gco::_make(mm, "nth", &xfer_nth); + auto T_ty = DTypeVarRef::make(mm, stbl->intern("T")); + auto list_T_ty = DListType::make(mm, T_ty); + auto int_ty = DAtomicType::make(mm, Metatype::t_integer()); + /** nth_ty: list x int -> T **/ + auto nth_ty + = obj + (DFunctionType::_make(mm, + T_ty, + list_T_ty, + int_ty)); + + return DPrimitive_gco_2_gco_gco::_make(mm, "nth", nth_ty, &xfer_nth); } // ----- cons ----- @@ -75,17 +96,24 @@ namespace xo { auto cdr_list = obj::from(cdr); - //auto T = DTypeVarRef::_make(rcx.allocator(), "T"); - return DList::cons(rcx.allocator(), car, cdr_list.data()); } DPrimitive_gco_2_gco_gco * - ObjectPrimitives::make_cons_pm(obj mm) + ObjectPrimitives::make_cons_pm(obj mm, StringTable * stbl) { - return DPrimitive_gco_2_gco_gco::_make(mm, "cons", &xfer_cons); + auto T_ty = DTypeVarRef::make(mm, stbl->intern("T")); + auto list_T_ty = DListType::make(mm, T_ty); + /** cons_ty: T x list -> list **/ + auto cons_ty + = obj(DFunctionType::_make(mm, + list_T_ty, + T_ty, + list_T_ty)); + + return DPrimitive_gco_2_gco_gco::_make(mm, "cons", cons_ty, &xfer_cons); } // ----- dict_make ----- @@ -98,9 +126,17 @@ namespace xo { } DPrimitive_gco_0 * - ObjectPrimitives::make_dict_make_pm(obj mm) + ObjectPrimitives::make_dict_make_pm(obj mm, + StringTable * stbl) { - return DPrimitive_gco_0::_make(mm, "dict_make", &xfer_dict_make); + (void)stbl; + + // nit: technically better to use empty struct type here + auto dict_ty = DAtomicType::make(mm, Metatype::t_dict()); + auto pm_ty = obj(DFunctionType::_make(mm, + dict_ty)); + + return DPrimitive_gco_0::_make(mm, "dict_make", pm_ty, &xfer_dict_make); } // ----- dict_at ----- diff --git a/xo-procedure2/src/procedure2/PrimitiveRegistry.cpp b/xo-procedure2/src/procedure2/PrimitiveRegistry.cpp index e62b6794..420a435e 100644 --- a/xo-procedure2/src/procedure2/PrimitiveRegistry.cpp +++ b/xo-procedure2/src/procedure2/PrimitiveRegistry.cpp @@ -26,6 +26,7 @@ namespace xo { bool PrimitiveRegistry::install_primitives(obj mm, + StringTable * stbl, InstallSink sink, InstallFlags flags) { @@ -40,7 +41,7 @@ namespace xo { for (const auto & fn : init_seq_v_) { log && log("do install fn (", i+1, "/", n, ")"); - ok = ok & fn(mm, sink, flags); + ok = ok & fn(mm, stbl, sink, flags); ++i; } diff --git a/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp b/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp index fee0bd91..eed4cf55 100644 --- a/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp +++ b/xo-procedure2/src/procedure2/procedure2_register_primitives.cpp @@ -54,6 +54,7 @@ namespace xo { bool procedure2_register_primitives(obj mm, + StringTable * stbl, InstallSink sink, InstallFlags flags) { @@ -61,10 +62,10 @@ namespace xo { bool ok = true; - ok = ok & install_aux(sink, ObjectPrimitives::make_cwd_pm(mm), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_nth_pm(mm), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_cons_pm(mm), flags); - ok = ok & install_aux(sink, ObjectPrimitives::make_dict_make_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), 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); diff --git a/xo-reader2/src/reader2/ParserStateMachine.cpp b/xo-reader2/src/reader2/ParserStateMachine.cpp index 5e6b4164..6ab2097b 100644 --- a/xo-reader2/src/reader2/ParserStateMachine.cpp +++ b/xo-reader2/src/reader2/ParserStateMachine.cpp @@ -71,6 +71,7 @@ namespace xo { PrimitiveRegistry::instance() .install_primitives(mm, + &stringtable, sink, pm_install_flags); diff --git a/xo-type/include/xo/type/DFunctionType.hpp b/xo-type/include/xo/type/DFunctionType.hpp index 7090a60b..51568bf5 100644 --- a/xo-type/include/xo/type/DFunctionType.hpp +++ b/xo-type/include/xo/type/DFunctionType.hpp @@ -32,17 +32,27 @@ namespace xo { * for a function with return type @p ret_type and arguments @p args **/ template - requires (std::same_as> && ...) + requires (std::convertible_to> && ...) explicit DFunctionType(obj mm, obj ret_type, Args... args); /** create instance using memory from @p mm, * for a function with return type @p ret_type and arguments @p args **/ template - requires (std::same_as> && ...) + requires (std::convertible_to> && ...) static DFunctionType * _make(obj mm, obj ret_type, Args... args); +#ifdef NOT_USING + /** create instance using memory from @p mm + * for function with return type @p ret_type and arguments @p args + **/ + template + requires (std::same_as> && ...) + static obj make(obj mm, + obj ret_type, Args... args); +#endif + ///@} /** @defgroup xo-scm-arraytype-type-facet **/ ///@{ @@ -72,14 +82,14 @@ namespace xo { }; template - requires (std::same_as> && ...) + requires (std::convertible_to> && ...) DFunctionType::DFunctionType(obj mm, obj return_type, Args... args) : return_type_{return_type}, - arg_types_{DArray::array(mm, args...)} + arg_types_{DArray::array(mm, args.template to_facet()...)} {} template - requires (std::same_as> && ...) + requires (std::convertible_to> && ...) DFunctionType * DFunctionType::_make(obj mm, obj ret_type, Args... args) { @@ -88,6 +98,18 @@ namespace xo { return new (mem) DFunctionType(mm, ret_type, args...); } +#ifdef NOT_USING + template + requires (std::same_as> && ...) + obj + DFunctionType::make(obj mm, obj ret_type, Args... args) + { + void * mem = mm.alloc_for(); + + return obj(_make(mm, ret_type, args...)); + } +#endif + } /*namespace scm*/ } /*namespace xo*/ diff --git a/xo-type/include/xo/type/Metatype.hpp b/xo-type/include/xo/type/Metatype.hpp index 30952df8..0b0aeefe 100644 --- a/xo-type/include/xo/type/Metatype.hpp +++ b/xo-type/include/xo/type/Metatype.hpp @@ -39,8 +39,13 @@ namespace xo { t_function, /* struct */ t_struct, + /* dicttionary: like struct, but w/ dynamic key/value pairs */ + t_dict, - /* any numeric type: i16|i32|i64|f32|f64 */ + /** any integer type: i16|i32|i64 **/ + t_integer, + + /** any numeric type: i16|i32|i64|f32|f64 **/ t_numeric, /* any type at all */ @@ -66,7 +71,9 @@ 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_integer() { return Metatype(code::t_integer); } static Metatype t_numeric() { return Metatype(code::t_numeric); } static Metatype t_any() { return Metatype(code::t_any); } diff --git a/xo-type/src/type/Metatype.cpp b/xo-type/src/type/Metatype.cpp index 9e50f11a..be42f61c 100644 --- a/xo-type/src/type/Metatype.cpp +++ b/xo-type/src/type/Metatype.cpp @@ -28,7 +28,9 @@ namespace xo { case code::t_array: return "array"; case code::t_function: return "function"; case code::t_struct: return "struct"; + case code::t_dict: return "dict"; + case code::t_integer: return "integer"; case code::t_numeric: return "numeric"; case code::t_any: return "any"; } @@ -68,7 +70,11 @@ namespace xo { return false; case code::t_struct: return false; + case code::t_dict: + return true; + case code::t_integer: + return true; case code::t_numeric: return true; case code::t_any: