diff --git a/include/xo/procedure2/ObjectPrimitives.hpp b/include/xo/procedure2/ObjectPrimitives.hpp index 696fc29..c403dc1 100644 --- a/include/xo/procedure2/ObjectPrimitives.hpp +++ b/include/xo/procedure2/ObjectPrimitives.hpp @@ -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 mm); + static DPrimitive_gco_2_dict_string * make_dict_lookup_pm(obj 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 mm); + static DPrimitive_gco_3_dict_string_gco * make_dict_upsert_pm(obj mm, + StringTable * stbl); /** create primitive: get fixed number of args for function **/ - static DPrimitive_gco_1_gco * make_fn_n_args_pm(obj mm); + static DPrimitive_gco_1_gco * make_fn_n_args_pm(obj mm, + StringTable * stbl); }; } /*namespace scm*/ diff --git a/src/procedure2/ObjectPrimitives.cpp b/src/procedure2/ObjectPrimitives.cpp index d52c530..4edd387 100644 --- a/src/procedure2/ObjectPrimitives.cpp +++ b/src/procedure2/ObjectPrimitives.cpp @@ -163,9 +163,21 @@ namespace xo { } DPrimitive_gco_2_dict_string * - ObjectPrimitives::make_dict_lookup_pm(obj mm) + ObjectPrimitives::make_dict_lookup_pm(obj 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 + (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 mm) + ObjectPrimitives::make_dict_upsert_pm(obj 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(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 mm) + ObjectPrimitives::make_fn_n_args_pm(obj 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(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*/ diff --git a/src/procedure2/procedure2_register_primitives.cpp b/src/procedure2/procedure2_register_primitives.cpp index eed4cf5..29f3be1 100644 --- a/src/procedure2/procedure2_register_primitives.cpp +++ b/src/procedure2/procedure2_register_primitives.cpp @@ -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; }