diff --git a/src/interpreter2/VirtualSchematikaMachine.cpp b/src/interpreter2/VirtualSchematikaMachine.cpp index 012d18ec..b2d1a675 100644 --- a/src/interpreter2/VirtualSchematikaMachine.cpp +++ b/src/interpreter2/VirtualSchematikaMachine.cpp @@ -4,6 +4,7 @@ **/ #include "VirtualSchematikaMachine.hpp" +#include "DPrimitive_gco_3_dict_string_gco.hpp" #include "VsmDefContFrame.hpp" #include "VsmApplyFrame.hpp" #include "VsmEvalArgsFrame.hpp" @@ -25,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -942,6 +944,36 @@ namespace xo { static DPrimitive_gco_0 s_dict_make_pm("_dict_make", &xfer_dict_make); + // ----- primitive: dict_upsert() ----- + + obj + xfer_dict_upsert(obj rcx, + obj dict, + obj key, + obj value) + { + scope log(XO_DEBUG(true)); + + log && log(xtag("dict.tseq", dict._typeseq()), + xtag("dict.tname", TypeRegistry::id2name(dict._typeseq()))); + log && log(xtag("key.tseq", key._typeseq()), + xtag("key.tname", TypeRegistry::id2name(key._typeseq()))); + log && log(xtag("value.tseq", value._typeseq()), + xtag("value.tname", TypeRegistry::id2name(value._typeseq()))); + + auto value_pr = FacetRegistry::instance().variant(value); + + log && log(xtag("value", value_pr)); + + dict->upsert(rcx.allocator(), + DDictionary::pair_type(key.data(), value)); + + return dict; + } + + static DPrimitive_gco_3_dict_string_gco s_dict_upsert_pm("_dict_upsert", + &xfer_dict_upsert); + // ----- install primitives ----- void @@ -994,6 +1026,18 @@ namespace xo { Reflect::require(), obj(&s_dict_make_pm)); } + + /* dict_upsert */ + { + const DUniqueString * name + = reader_.intern_string("dict_upsert"); + + global_env_->_upsert_value + (mm_.to_op(), + name, + Reflect::require(), + obj(&s_dict_upsert_pm)); + } } } /*namespace scm*/