diff --git a/xo-gc/include/xo/gc/GCObjectConversion.hpp b/xo-gc/include/xo/gc/GCObjectConversion.hpp index 6e3e84df..8a950c82 100644 --- a/xo-gc/include/xo/gc/GCObjectConversion.hpp +++ b/xo-gc/include/xo/gc/GCObjectConversion.hpp @@ -7,6 +7,8 @@ #include #include +#include +#include namespace xo { namespace scm { @@ -20,10 +22,70 @@ namespace xo { using AGCObject = xo::mm::AGCObject; using AAllocator = xo::mm::AAllocator; + /** find gc-aware representation for @p x. + * If necessary allocate from @p mm, but may + * refer to @p x in-place + **/ static obj to_gco(obj mm, const T & x); + /** convert to native representation @tparam T from gc-aware + * @p gco. If necessary allocate from @p mm, but + * may instead refer to @p x in-place + **/ static T from_gco(obj mm, obj gco); }; + /** Motivating use-case for GCObjectConversion is to transform + * primitive function arguments and results to/from gc-aware + * representation. + * + * However: Schematika also supports runtime polymorphism + * which leads to primitives that expect obj arguments. + * + * Also, Schematika expression parser needs representation for + * expressions, before type unification. + * + * Consider a function like: + * def fact = lambda (n : i64) { if (n <= 0) then 1 else (n * fact(n - 1)); } + * During expression parsing the rhs argument to multiply has unknown type. + * To construct an expression for input to unification will use polymorphic + * binding for multiply primitive, relying on specialization here for + * its implementation. + **/ + template + struct GCObjectConversion> { + using AGCObject = xo::mm::AGCObject; + using AAllocator = xo::mm::AAllocator; + using FacetRegistry = xo::facet::FacetRegistry; + using DVariantPlaceholder = xo::facet::DVariantPlaceholder; + + static obj to_gco(obj, + obj gco) { + if constexpr (std::is_same_v) { + // trivial conversion! + return gco; + } else if constexpr (std::is_same_v) { + // runtime polymorphism + return FacetRegistry::instance().variant(gco); + } else /* DRepr != DVariantPlaceholder */ { + // known content w/ fat object pointer + return obj(gco.data()); + } + } + + static obj from_gco(obj, + obj gco) { + if constexpr (std::is_same_v) { + // trivial conversion + return gco; + } else { + // both runtime and comptime polymorphism + // use same path here, since representation of @p gco + // is type-erased here + + return FacetRegistry::instance().variant(gco); + } + } + }; } /*namespace scm */ } /*namespace xo*/ diff --git a/xo-object2/include/xo/object2/DArray.hpp b/xo-object2/include/xo/object2/DArray.hpp index 0dc13cd1..097b9a45 100644 --- a/xo-object2/include/xo/object2/DArray.hpp +++ b/xo-object2/include/xo/object2/DArray.hpp @@ -23,7 +23,7 @@ namespace xo { * fixed at construction time, but not part of type. * Can reallocate to change **/ - struct DArray { + class DArray { public: /** @defgroup darray-types type traits **/ ///@{ diff --git a/xo-object2/include/xo/object2/number/GCObjectConversion_DFloat.hpp b/xo-object2/include/xo/object2/number/GCObjectConversion_DFloat.hpp index 8ce4b2b6..959eeca0 100644 --- a/xo-object2/include/xo/object2/number/GCObjectConversion_DFloat.hpp +++ b/xo-object2/include/xo/object2/number/GCObjectConversion_DFloat.hpp @@ -19,7 +19,7 @@ namespace xo { using AGCObject = xo::mm::AGCObject; using AAllocator = xo::mm::AAllocator; - static obj to_gco(obj mm, const double & x); + static obj to_gco(obj mm, double x); static double from_gco(obj mm, obj gco); }; diff --git a/xo-object2/include/xo/object2/number/GCObjectConversion_DInteger.hpp b/xo-object2/include/xo/object2/number/GCObjectConversion_DInteger.hpp new file mode 100644 index 00000000..458312c9 --- /dev/null +++ b/xo-object2/include/xo/object2/number/GCObjectConversion_DInteger.hpp @@ -0,0 +1,29 @@ +/** @file GCObjectConversion_DInteger.hpp + * + * @author Roland Conybeare, Jan 2026 + **/ + +#pragma once + +#include "DInteger.hpp" +#include "number/IGCObject_DInteger.hpp" +#include + +namespace xo { + namespace scm { + + template <> + struct GCObjectConversion { + static_assert(std::is_same_v); + + using AGCObject = xo::mm::AGCObject; + using AAllocator = xo::mm::AAllocator; + + static obj to_gco(obj mm, long x); + static long from_gco(obj mm, obj gco); + }; + + } +} /*namespace xo*/ + +/* end GCObjectConversion_DInteger.hpp */ diff --git a/xo-object2/src/object2/CMakeLists.txt b/xo-object2/src/object2/CMakeLists.txt index 2902a4ee..2ea8a07f 100644 --- a/xo-object2/src/object2/CMakeLists.txt +++ b/xo-object2/src/object2/CMakeLists.txt @@ -6,6 +6,7 @@ set(SELF_SRCS object2_register_types.cpp object2_register_facets.cpp GCObjectConversion_DFloat.cpp + GCObjectConversion_DInteger.cpp IGCObject_DArray.cpp IGCObject_DFloat.cpp IGCObject_DBoolean.cpp diff --git a/xo-object2/src/object2/GCObjectConversion_DFloat.cpp b/xo-object2/src/object2/GCObjectConversion_DFloat.cpp index a99c68ce..794431d2 100644 --- a/xo-object2/src/object2/GCObjectConversion_DFloat.cpp +++ b/xo-object2/src/object2/GCObjectConversion_DFloat.cpp @@ -13,7 +13,7 @@ namespace xo { obj GCObjectConversion::to_gco(obj mm, - const double & x) + double x) { return DFloat::box(mm, x); } diff --git a/xo-object2/src/object2/GCObjectConversion_DInteger.cpp b/xo-object2/src/object2/GCObjectConversion_DInteger.cpp new file mode 100644 index 00000000..bdaf8a18 --- /dev/null +++ b/xo-object2/src/object2/GCObjectConversion_DInteger.cpp @@ -0,0 +1,41 @@ +/** @file GCObjectConversion_DInteger.cpp + * + * @author Roland Conybeare, Jan 2026 + **/ + +#include "number/GCObjectConversion_DInteger.hpp" +#include + +namespace xo { + using xo::mm::AGCObject; + + namespace scm { + + obj + GCObjectConversion::to_gco(obj mm, + long x) + { + return DInteger::box(mm, x); + } + + long + GCObjectConversion::from_gco(obj mm, + obj gco) + { + (void)mm; + + auto int_obj = obj::from(gco); + + if (!int_obj) { + throw std::runtime_error + (tostr("Object obj found where Integer expected", + xtag("obj", gco))); + } + + return int_obj.data()->value(); + } + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end GCObjectConversion_DFloat.cpp */ diff --git a/xo-procedure2/doc/implementation.rst b/xo-procedure2/doc/implementation.rst new file mode 100644 index 00000000..418dc759 --- /dev/null +++ b/xo-procedure2/doc/implementation.rst @@ -0,0 +1,25 @@ +.. _implementation: + +.. toctree:: + :maxdepth: 2 + +Components +========== + +Library dependency tower for *xo-procedure2* + +.. ditaa:: + + +--------------------------------+ + | xo_gc | + +--------------------------------+ + | xo_alloc2 | + +--------------------------------+ + | xo_facet | + +----------------+---------------+ + | xo_reflectutil | xo_indentlog | + +----------------+---------------+ + | xo_cmake | + +--------------------------------+ + +Expect to have xo_facet depending on xo_arena instead of using std::unordered_map diff --git a/xo-procedure2/idl/Procedure.json5 b/xo-procedure2/idl/Procedure.json5 index f0eac6b5..f26a4e56 100644 --- a/xo-procedure2/idl/Procedure.json5 +++ b/xo-procedure2/idl/Procedure.json5 @@ -56,7 +56,6 @@ doc: ["invoke procedure; assume arguments satisfy type system" ], return_type: "obj", args: [ - {type: "obj", name: "rcx"}, {type: "const DArray *", name: "args"}, ] } diff --git a/xo-procedure2/include/xo/procedure2/DPrimitive.hpp b/xo-procedure2/include/xo/procedure2/DPrimitive.hpp index 106cbed1..cf913a15 100644 --- a/xo-procedure2/include/xo/procedure2/DPrimitive.hpp +++ b/xo-procedure2/include/xo/procedure2/DPrimitive.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -62,24 +63,29 @@ namespace xo { bool is_nary() const noexcept { return false; } static constexpr std::int32_t n_args() noexcept { return Traits::n_args; } - obj apply_nocheck(obj rcx, const DArray * args) { - return _apply_nocheck(rcx, args, + obj apply_nocheck(const DArray * args) { + return _apply_nocheck(args, std::make_index_sequence{}); } private: template - obj _apply_nocheck(obj rcx, - const DArray * args, + obj _apply_nocheck(const DArray * args, std::index_sequence) { + using xo::facet::FacetRegistry; + using R = typename Traits::return_type; + assert(args); + assert(args->size() > 0); + + obj rcx + = FacetRegistry::instance().variant(args->at(0)); obj mm = rcx.allocator(); R result - = fn_(rcx, - GCObjectConversion>::from_gco(mm, args->at(Is))... ); + = fn_(GCObjectConversion>::from_gco(mm, args->at(Is))... ); return GCObjectConversion::to_gco(mm, result); } diff --git a/xo-procedure2/include/xo/procedure2/Procedure.hpp b/xo-procedure2/include/xo/procedure2/Procedure.hpp index 784608ed..8b2cd91a 100644 --- a/xo-procedure2/include/xo/procedure2/Procedure.hpp +++ b/xo-procedure2/include/xo/procedure2/Procedure.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for facet .hpp file: diff --git a/xo-procedure2/include/xo/procedure2/RuntimeContext.hpp b/xo-procedure2/include/xo/procedure2/RuntimeContext.hpp index 3241451b..2e8300ed 100644 --- a/xo-procedure2/include/xo/procedure2/RuntimeContext.hpp +++ b/xo-procedure2/include/xo/procedure2/RuntimeContext.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for facet .hpp file: diff --git a/xo-procedure2/include/xo/procedure2/detail/AProcedure.hpp b/xo-procedure2/include/xo/procedure2/detail/AProcedure.hpp index 63a4da9b..1be5e0d1 100644 --- a/xo-procedure2/include/xo/procedure2/detail/AProcedure.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/AProcedure.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -56,7 +56,7 @@ public: // nonconst methods /** invoke procedure; assume arguments satisfy type system **/ - virtual obj apply_nocheck(Opaque data, obj rcx, const DArray * args) = 0; + virtual obj apply_nocheck(Opaque data, const DArray * args) = 0; ///@} }; /*AProcedure*/ diff --git a/xo-procedure2/include/xo/procedure2/detail/ARuntimeContext.hpp b/xo-procedure2/include/xo/procedure2/detail/ARuntimeContext.hpp index 4e96bc8f..42030d9d 100644 --- a/xo-procedure2/include/xo/procedure2/detail/ARuntimeContext.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/ARuntimeContext.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/xo-procedure2/include/xo/procedure2/detail/IProcedure_Any.hpp b/xo-procedure2/include/xo/procedure2/detail/IProcedure_Any.hpp index 5d711d4c..3f66fcd5 100644 --- a/xo-procedure2/include/xo/procedure2/detail/IProcedure_Any.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/IProcedure_Any.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -60,7 +60,7 @@ namespace scm { [[noreturn]] std::int32_t n_args(Copaque) const noexcept override { _fatal(); } // nonconst methods - [[noreturn]] obj apply_nocheck(Opaque, obj, const DArray *) override; + [[noreturn]] obj apply_nocheck(Opaque, const DArray *) override; ///@} diff --git a/xo-procedure2/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp b/xo-procedure2/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp index 11f2cd60..4b4351dd 100644 --- a/xo-procedure2/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/IProcedure_DPrimitive_gco_2_gco_gco.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/IProcedure_DPrimitive_gco_2_gco_gco.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -57,7 +57,7 @@ namespace xo { // non-const methods /** invoke procedure; assume arguments satisfy type system **/ - static obj apply_nocheck(DPrimitive_gco_2_gco_gco & self, obj rcx, const DArray * args); + static obj apply_nocheck(DPrimitive_gco_2_gco_gco & self, const DArray * args); ///@} }; diff --git a/xo-procedure2/include/xo/procedure2/detail/IProcedure_Xfer.hpp b/xo-procedure2/include/xo/procedure2/detail/IProcedure_Xfer.hpp index 4f84652e..adf4995d 100644 --- a/xo-procedure2/include/xo/procedure2/detail/IProcedure_Xfer.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/IProcedure_Xfer.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -50,8 +50,8 @@ namespace scm { } // non-const methods - obj apply_nocheck(Opaque data, obj rcx, const DArray * args) override { - return I::apply_nocheck(_dcast(data), rcx, args); + obj apply_nocheck(Opaque data, const DArray * args) override { + return I::apply_nocheck(_dcast(data), args); } ///@} diff --git a/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Any.hpp b/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Any.hpp index 1e5f97c0..419d45cc 100644 --- a/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Any.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Any.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp b/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp index cd71b73e..e9f5512e 100644 --- a/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/IRuntimeContext_Xfer.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/xo-procedure2/include/xo/procedure2/detail/RProcedure.hpp b/xo-procedure2/include/xo/procedure2/detail/RProcedure.hpp index 93599ae3..9fff0c6c 100644 --- a/xo-procedure2/include/xo/procedure2/detail/RProcedure.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/RProcedure.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/Procedure.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -56,8 +56,8 @@ public: } // non-const methods (still const in router!) - obj apply_nocheck(obj rcx, const DArray * args) { - return O::iface()->apply_nocheck(O::data(), rcx, args); + obj apply_nocheck(const DArray * args) { + return O::iface()->apply_nocheck(O::data(), args); } ///@} diff --git a/xo-procedure2/include/xo/procedure2/detail/RRuntimeContext.hpp b/xo-procedure2/include/xo/procedure2/detail/RRuntimeContext.hpp index b06227c8..06b093de 100644 --- a/xo-procedure2/include/xo/procedure2/detail/RRuntimeContext.hpp +++ b/xo-procedure2/include/xo/procedure2/detail/RRuntimeContext.hpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/RuntimeContext.json5] * 2. jinja2 template for abstract facet .hpp file: diff --git a/xo-procedure2/include/xo/procedure2/init_primitives.hpp b/xo-procedure2/include/xo/procedure2/init_primitives.hpp index d4150d2d..5e2d08e8 100644 --- a/xo-procedure2/include/xo/procedure2/init_primitives.hpp +++ b/xo-procedure2/include/xo/procedure2/init_primitives.hpp @@ -3,13 +3,19 @@ #pragma once #include "DPrimitive.hpp" +#include "DPrimitive_gco_2_gco_gco.hpp" namespace xo { namespace scm { +#ifdef NOT_YET using Primitive_f64_1_f64 = Primitive; using Primitive_f64_2_f64_f64 = Primitive; +#endif struct Primitives { + static DPrimitive_gco_2_gco_gco s_mul_gco_gco_pm; + +#ifdef NOT_YET static Primitive_f64_1_f64 s_neg_f64_pm; static Primitive_f64_2_f64_f64 s_add_f64_f64_pm; @@ -22,6 +28,7 @@ namespace xo { static Primitive_f64_1_f64 s_sin_f64_pm; static Primitive_f64_1_f64 s_cos_f64_pm; static Primitive_f64_1_f64 s_tan_f64_pm; +#endif }; } } diff --git a/xo-procedure2/src/procedure2/IProcedure_Any.cpp b/xo-procedure2/src/procedure2/IProcedure_Any.cpp index d28d98ee..79b3b778 100644 --- a/xo-procedure2/src/procedure2/IProcedure_Any.cpp +++ b/xo-procedure2/src/procedure2/IProcedure_Any.cpp @@ -35,7 +35,7 @@ IProcedure_Any::_valid // nonconst methods auto -IProcedure_Any::apply_nocheck(Opaque, obj, const DArray *) -> obj +IProcedure_Any::apply_nocheck(Opaque, const DArray *) -> obj { _fatal(); } diff --git a/xo-procedure2/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp b/xo-procedure2/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp index 67e73c97..5266477c 100644 --- a/xo-procedure2/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp +++ b/xo-procedure2/src/procedure2/IProcedure_DPrimitive_gco_2_gco_gco.cpp @@ -2,7 +2,7 @@ * * Generated automagically from ingredients: * 1. code generator: - * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * [/Users/roland/proj/xo-umbrella2/xo-facet/codegen/genfacet] * arguments: * --input [idl/IProcedure_DPrimitive_gco_2_gco_gco.json5] * 2. jinja2 template for abstract facet .hpp file: @@ -28,9 +28,9 @@ namespace xo { } auto - IProcedure_DPrimitive_gco_2_gco_gco::apply_nocheck(DPrimitive_gco_2_gco_gco & self, obj rcx, const DArray * args) -> obj + IProcedure_DPrimitive_gco_2_gco_gco::apply_nocheck(DPrimitive_gco_2_gco_gco & self, const DArray * args) -> obj { - return self.apply_nocheck(rcx, args); + return self.apply_nocheck(args); } } /*namespace scm*/ diff --git a/xo-procedure2/src/procedure2/init_primitives.cpp b/xo-procedure2/src/procedure2/init_primitives.cpp index 35709e0f..dbcb3b35 100644 --- a/xo-procedure2/src/procedure2/init_primitives.cpp +++ b/xo-procedure2/src/procedure2/init_primitives.cpp @@ -5,10 +5,23 @@ #include "init_primitives.hpp" #include "DPrimitive.hpp" +#include +#include +#include +#include +#include +#include +#include +#include #include namespace xo { + using xo::mm::AAllocator; + using xo::scm::DFloat; + using xo::facet::with_facet; + namespace scm { +#ifdef NOT_YET double neg_f64(double x) { return -x; @@ -23,11 +36,17 @@ namespace xo { sub_f64_f64(double x, double y) { return x - y; } +#endif -#ifdef NOT_YET obj - mul_any_any(obj x_gco, obj y_gco) + mul_gco_gco(obj rcx, + obj x_gco, + obj y_gco) { + using xo::reflect::typeseq; + + obj mm = rcx.allocator(); + // PLACEHOLDER // TODO: @@ -44,20 +63,45 @@ namespace xo { // FOR NOW: just test runtime values // - if (x_tseq == typeseq::id()) { - if (y_tseq == typeseq::id()) { - // unusable placeholder allocator; - obj placeholder_mm; + if (x_tseq == typeseq::id()) { + // i64 * .. + long x = GCObjectConversion::from_gco(mm, x_gco); + if (y_tseq == typeseq::id()) { + // i64 * i64 + long y = GCObjectConversion::from_gco(mm, y_gco); + + return DInteger::box(mm, x * y); + } else if (y_tseq == typeseq::id()) { + // i64 * f64 + double y = GCObjectConversion::from_gco(mm, y_gco); + + return DFloat::box(mm, x * y); + } + } else if (x_tseq == typeseq::id()) { + if (y_tseq == typeseq::id()) { + // f64 * i64. + double x = GCObjectConversion::from_gco(mm, x_gco); + long y = GCObjectConversion::from_gco(mm, y_gco); + + return DFloat::box(mm, x * y); + } else if (y_tseq == typeseq::id()) { // f64 * f64. - double x = GCObjectConversion::from_gco(placeholder_mm, x_gco); - double y = GCObjectConversion::from_gco(placeholder_mm, y_gco); - + double x = GCObjectConversion::from_gco(mm, x_gco); + double y = GCObjectConversion::from_gco(mm, y_gco); + return DFloat::box(mm, x * y); + } + } + // here: error + throw std::runtime_error(tostr("mul_gco_gco: unexpected argument types xt,yt", + xtag("x.tseq", x_tseq), + xtag("y.tseq", y_tseq))); + return obj(); } -#endif +#ifdef NOT_YET double mul_f64_f64(double x, double y) { return x * y; @@ -92,7 +136,12 @@ namespace xo { tan_f64(double x) { return ::tan(x); } +#endif + DPrimitive_gco_2_gco_gco + Primitives::s_mul_gco_gco_pm("_mul", &mul_gco_gco); + +#ifdef NOT_YET Primitive_f64_1_f64 Primitives::s_neg_f64_pm("_neg_d", &neg_f64); @@ -123,6 +172,7 @@ namespace xo { Primitive_f64_1_f64 Primitives::s_tan_f64_pm("_tan_d", &tan_f64); +#endif } /*namespace scm*/ } /*namespace xo*/ diff --git a/xo-reader2/src/reader2/DProgressSsm.cpp b/xo-reader2/src/reader2/DProgressSsm.cpp index f501d5fe..85f7b1d3 100644 --- a/xo-reader2/src/reader2/DProgressSsm.cpp +++ b/xo-reader2/src/reader2/DProgressSsm.cpp @@ -226,8 +226,11 @@ namespace xo { case tokentype::tk_minus: break; case tokentype::tk_star: +#ifdef NOT_YET this->on_operator_token(tk, p_psm); return; +#endif + break; case tokentype::tk_slash: case tokentype::tk_cmpeq: case tokentype::tk_cmpne: