From 0029a3bc1ef7b2fd6342076ae7eec3aa6cad85ec Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 27 Nov 2025 11:03:41 -0500 Subject: [PATCH] xo-interpreter: add Primitive object, to expose builtin functions --- example/ex1/ex1.cpp | 2 +- .../{Primitive.hpp => PrimitiveExpr.hpp} | 70 +++++++-------- src/expression/Apply.cpp | 30 +++---- src/expression/CMakeLists.txt | 2 +- .../{Primitive.cpp => PrimitiveExpr.cpp} | 90 +++++++++---------- 5 files changed, 97 insertions(+), 97 deletions(-) rename include/xo/expression/{Primitive.hpp => PrimitiveExpr.hpp} (77%) rename src/expression/{Primitive.cpp => PrimitiveExpr.cpp} (68%) diff --git a/example/ex1/ex1.cpp b/example/ex1/ex1.cpp index 470941af..a8e6e72e 100644 --- a/example/ex1/ex1.cpp +++ b/example/ex1/ex1.cpp @@ -1,7 +1,7 @@ /** @file ex1.cpp **/ #include "xo/expression/Constant.hpp" -#include "xo/expression/Primitive.hpp" +#include "xo/expression/PrimitiveExpr.hpp" #include "xo/expression/llvmintrinsic.hpp" #include #include diff --git a/include/xo/expression/Primitive.hpp b/include/xo/expression/PrimitiveExpr.hpp similarity index 77% rename from include/xo/expression/Primitive.hpp rename to include/xo/expression/PrimitiveExpr.hpp index e53bbcb9..6050e8db 100644 --- a/include/xo/expression/Primitive.hpp +++ b/include/xo/expression/PrimitiveExpr.hpp @@ -1,4 +1,4 @@ -/** @file Primitive.hpp +/** @file PrimitiveExpr.hpp * * Author: Roland Conybeare **/ @@ -20,7 +20,7 @@ extern "C" { namespace xo { namespace scm { - /** @class Primitive + /** @class PrimitiveExpr * @brief syntax for a constant that refers to a known function. * * Two cases here: @@ -38,7 +38,7 @@ namespace xo { * won't work here. **/ template - class Primitive: public PrimitiveExprInterface { + class PrimitiveExpr: public PrimitiveExprInterface { public: using Reflect = xo::reflect::Reflect; using TaggedPtr = xo::reflect::TaggedPtr; @@ -46,13 +46,13 @@ namespace xo { using fptr_type = FunctionPointer; public: - static rp make(const std::string & name, + static rp make(const std::string & name, FunctionPointer fnptr, bool explicit_symbol_def, llvmintrinsic intrinsic) { TypeDescr fn_type = Reflect::require(); - return new Primitive(fn_type, name, fnptr, explicit_symbol_def, intrinsic); + return new PrimitiveExpr(fn_type, name, fnptr, explicit_symbol_def, intrinsic); } /** see classes below for intrinsics **/ @@ -68,7 +68,7 @@ namespace xo { return TaggedPtr(value_td_, erased_ptr); } - // ----- PrimitiveInterface ----- + // ----- PrimitiveExprInterface ----- virtual llvmintrinsic intrinsic() const override { return intrinsic_; } virtual bool explicit_symbol_def() const override { return explicit_symbol_def_; } @@ -84,7 +84,7 @@ namespace xo { // ----- Expression ----- virtual void display(std::ostream & os) const override { - os << "value_td()->short_name()) << xtag("value", this->value()) @@ -99,14 +99,14 @@ namespace xo { * we don't have pretty printer for native function pointers anyway * + simplifies ppdetail_atomic */ - return ppii.pps()->pretty_struct(ppii, "Primitive", + return ppii.pps()->pretty_struct(ppii, "PrimitiveExpr", refrtag("name", name_), rtag("type", print::quot(this->valuetype()->short_name())), refrtag("value", (void*)(this->value()))); } private: - Primitive(TypeDescr fn_type, + PrimitiveExpr(TypeDescr fn_type, const std::string & name, FunctionPointer fnptr, bool explicit_symbol_def, @@ -119,9 +119,9 @@ namespace xo { intrinsic_{intrinsic} { if (!value_td_->is_function()) - throw std::runtime_error("Primitive: expected function pointer"); + throw std::runtime_error("PrimitiveExpr: expected function pointer"); if (!value_td_->fn_retval()) - throw std::runtime_error("Primitive: expected non-null function return value"); + throw std::runtime_error("PrimitiveExpr: expected non-null function return value"); } @@ -145,75 +145,75 @@ namespace xo { * all others: generate direct use of LLVM intrinsic **/ llvmintrinsic intrinsic_; - }; /*Primitive*/ + }; /*PrimitiveExpr*/ /** adopt function @p x as a callable primitive function named @p name **/ template - rp> + rp> make_primitive(const std::string & name, FunctionPointer x, bool explicit_symbol_def, llvmintrinsic intrinsic) { - return Primitive::make(name, x, explicit_symbol_def, intrinsic); + return PrimitiveExpr::make(name, x, explicit_symbol_def, intrinsic); } // NOTE: see xo-reader/src/reader/progress_xs.cpp // binding operators to primitive applications. /** builtin primitives :: i64 x i64 -> bool **/ - class Primitive_cmp_i64 : public Primitive { + class PrimitiveExpr_cmp_i64 : public PrimitiveExpr { public: - using PrimitiveType = Primitive; + using PrimitiveExprType = PrimitiveExpr; public: /** eq2_i64: compare two 64-bit integers for equality **/ - static rp make_cmp_eq2_i64(); + static rp make_cmp_eq2_i64(); /** ne2_i64: compare two 64-bit integers for inequality **/ - static rp make_cmp_ne2_i64(); + static rp make_cmp_ne2_i64(); /** lt2_i64: compare two 64-bit integers for lessthan **/ - static rp make_cmp_lt2_i64(); + static rp make_cmp_lt2_i64(); /** lt2_i64: compare two 64-bit integers for lessthanorequal **/ - static rp make_cmp_le2_i64(); + static rp make_cmp_le2_i64(); /** gt2_i64: compare two 64-bit integers for greaterthan **/ - static rp make_cmp_gt2_i64(); + static rp make_cmp_gt2_i64(); /** ge2_i64: compare two 64-bit integers for greaterthan **/ - static rp make_cmp_ge2_i64(); + static rp make_cmp_ge2_i64(); }; /** builtin primitives :: i64 x i64 -> i64 **/ - class Primitive_i64 : public Primitive { + class PrimitiveExpr_i64 : public PrimitiveExpr { public: - using PrimitiveType = Primitive; + using PrimitiveExprType = PrimitiveExpr; public: /** add2_i64: add two 64-bit integers **/ - static rp make_add2_i64(); + static rp make_add2_i64(); /** sub2_i64: subtract two 64-bit integers **/ - static rp make_sub2_i64(); + static rp make_sub2_i64(); /** mul2_i64: multiply two 64-bit integers **/ - static rp make_mul2_i64(); + static rp make_mul2_i64(); /** div2_i64: divide two 64-bit integers **/ - static rp make_div2_i64(); + static rp make_div2_i64(); }; /** builtin primitives :: f64 x f64 -> f64 **/ - class Primitive_f64 : public Primitive { + class PrimitiveExpr_f64 : public PrimitiveExpr { public: - using PrimitiveType = Primitive; + using PrimitiveExprType = PrimitiveExpr; public: /** add2_f64: add two 64-bit floating-point numbers **/ - static rp make_add2_f64(); + static rp make_add2_f64(); /** sub2_f64: subtract two 64-bit floating-point numbers **/ - static rp make_sub2_f64(); + static rp make_sub2_f64(); /** mul2_f64: multiply two 64-bit floating-point numbers **/ - static rp make_mul2_f64(); + static rp make_mul2_f64(); /** div2_f64: divide two 64-bit floating-point numbers **/ - static rp make_div2_f64(); + static rp make_div2_f64(); }; } /*namespace scm*/ } /*namespace xo*/ -/** end Primitive.hpp **/ +/** end PrimitiveExpr.hpp **/ diff --git a/src/expression/Apply.cpp b/src/expression/Apply.cpp index 1a205b86..7ab1089c 100644 --- a/src/expression/Apply.cpp +++ b/src/expression/Apply.cpp @@ -1,7 +1,7 @@ /* @file Apply.cpp */ #include "Apply.hpp" -#include "Primitive.hpp" +#include "PrimitiveExpr.hpp" #include "exprtype.hpp" #include "pretty_expression.hpp" #include "xo/indentlog/print/vector.hpp" @@ -36,7 +36,7 @@ namespace xo { Apply::make_cmp_eq_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_cmp_i64::make_cmp_eq2_i64(), + return Apply::make(PrimitiveExpr_cmp_i64::make_cmp_eq2_i64(), {lhs, rhs}); } @@ -44,7 +44,7 @@ namespace xo { Apply::make_cmp_ne_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_cmp_i64::make_cmp_ne2_i64(), + return Apply::make(PrimitiveExpr_cmp_i64::make_cmp_ne2_i64(), {lhs, rhs}); } @@ -52,7 +52,7 @@ namespace xo { Apply::make_cmp_lt_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_cmp_i64::make_cmp_lt2_i64(), + return Apply::make(PrimitiveExpr_cmp_i64::make_cmp_lt2_i64(), {lhs, rhs}); } @@ -60,7 +60,7 @@ namespace xo { Apply::make_cmp_le_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_cmp_i64::make_cmp_le2_i64(), + return Apply::make(PrimitiveExpr_cmp_i64::make_cmp_le2_i64(), {lhs, rhs}); } @@ -68,7 +68,7 @@ namespace xo { Apply::make_cmp_gt_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_cmp_i64::make_cmp_gt2_i64(), + return Apply::make(PrimitiveExpr_cmp_i64::make_cmp_gt2_i64(), {lhs, rhs}); } @@ -76,7 +76,7 @@ namespace xo { Apply::make_cmp_ge_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_cmp_i64::make_cmp_ge2_i64(), + return Apply::make(PrimitiveExpr_cmp_i64::make_cmp_ge2_i64(), {lhs, rhs}); } @@ -86,7 +86,7 @@ namespace xo { Apply::make_add2_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_i64::make_add2_i64(), + return Apply::make(PrimitiveExpr_i64::make_add2_i64(), {lhs, rhs}); } @@ -94,7 +94,7 @@ namespace xo { Apply::make_sub2_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_i64::make_sub2_i64(), + return Apply::make(PrimitiveExpr_i64::make_sub2_i64(), {lhs, rhs}); } @@ -102,7 +102,7 @@ namespace xo { Apply::make_mul2_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_i64::make_mul2_i64(), + return Apply::make(PrimitiveExpr_i64::make_mul2_i64(), {lhs, rhs}); } @@ -110,7 +110,7 @@ namespace xo { Apply::make_div2_i64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_i64::make_div2_i64(), + return Apply::make(PrimitiveExpr_i64::make_div2_i64(), {lhs, rhs}); } @@ -120,7 +120,7 @@ namespace xo { Apply::make_add2_f64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_f64::make_add2_f64(), + return Apply::make(PrimitiveExpr_f64::make_add2_f64(), {lhs, rhs}); } @@ -128,7 +128,7 @@ namespace xo { Apply::make_sub2_f64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_f64::make_sub2_f64(), + return Apply::make(PrimitiveExpr_f64::make_sub2_f64(), {lhs, rhs}); } @@ -136,7 +136,7 @@ namespace xo { Apply::make_mul2_f64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_f64::make_mul2_f64(), + return Apply::make(PrimitiveExpr_f64::make_mul2_f64(), {lhs, rhs}); } @@ -144,7 +144,7 @@ namespace xo { Apply::make_div2_f64(const rp & lhs, const rp & rhs) { - return Apply::make(Primitive_f64::make_div2_f64(), + return Apply::make(PrimitiveExpr_f64::make_div2_f64(), {lhs, rhs}); } diff --git a/src/expression/CMakeLists.txt b/src/expression/CMakeLists.txt index d2a9a7e1..a07efea3 100644 --- a/src/expression/CMakeLists.txt +++ b/src/expression/CMakeLists.txt @@ -14,7 +14,7 @@ set(SELF_SRCS GlobalSymtab.cpp LocalSymtab.cpp ConvertExpr.cpp - Primitive.cpp + PrimitiveExpr.cpp typeinf/type_ref.cpp typeinf/type_unifier.cpp typeinf/TypeBlueprint.cpp diff --git a/src/expression/Primitive.cpp b/src/expression/PrimitiveExpr.cpp similarity index 68% rename from src/expression/Primitive.cpp rename to src/expression/PrimitiveExpr.cpp index 4a69ef8e..09246a62 100644 --- a/src/expression/Primitive.cpp +++ b/src/expression/PrimitiveExpr.cpp @@ -1,6 +1,6 @@ -/* @file Primitive.cpp */ +/* @file PrimitiveExpr.cpp */ -#include "Primitive.hpp" +#include "PrimitiveExpr.hpp" #include extern "C" { @@ -86,12 +86,12 @@ extern "C" { namespace xo { namespace scm { auto - Primitive_cmp_i64::make_cmp_eq2_i64() -> rp + PrimitiveExpr_cmp_i64::make_cmp_eq2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("cmp_eq2_i64", + s_retval = PrimitiveExpr::make("cmp_eq2_i64", &cmp_eq2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_eq); @@ -100,12 +100,12 @@ namespace xo { } auto - Primitive_cmp_i64::make_cmp_ne2_i64() -> rp + PrimitiveExpr_cmp_i64::make_cmp_ne2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("cmp_ne2_i64", + s_retval = PrimitiveExpr::make("cmp_ne2_i64", &cmp_ne2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_ne); @@ -114,12 +114,12 @@ namespace xo { } auto - Primitive_cmp_i64::make_cmp_lt2_i64() -> rp + PrimitiveExpr_cmp_i64::make_cmp_lt2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("cmp_lt2_i64", + s_retval = PrimitiveExpr::make("cmp_lt2_i64", &cmp_lt2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_slt); @@ -128,12 +128,12 @@ namespace xo { } auto - Primitive_cmp_i64::make_cmp_le2_i64() -> rp + PrimitiveExpr_cmp_i64::make_cmp_le2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("cmp_le2_i64", + s_retval = PrimitiveExpr::make("cmp_le2_i64", &cmp_le2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_sle); @@ -142,12 +142,12 @@ namespace xo { } auto - Primitive_cmp_i64::make_cmp_gt2_i64() -> rp + PrimitiveExpr_cmp_i64::make_cmp_gt2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("cmp_gt2_i64", + s_retval = PrimitiveExpr::make("cmp_gt2_i64", &cmp_gt2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_sgt); @@ -156,12 +156,12 @@ namespace xo { } auto - Primitive_cmp_i64::make_cmp_ge2_i64() -> rp + PrimitiveExpr_cmp_i64::make_cmp_ge2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("cmp_ge2_i64", + s_retval = PrimitiveExpr::make("cmp_ge2_i64", &cmp_ge2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_sge); @@ -172,12 +172,12 @@ namespace xo { /* TODO: remaining integer arithmetic */ auto - Primitive_i64::make_add2_i64() -> rp + PrimitiveExpr_i64::make_add2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("add2_i64", + s_retval = PrimitiveExpr::make("add2_i64", &add2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_add); @@ -186,12 +186,12 @@ namespace xo { } auto - Primitive_i64::make_sub2_i64() -> rp + PrimitiveExpr_i64::make_sub2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("sub2_i64", + s_retval = PrimitiveExpr::make("sub2_i64", &sub2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_sub); @@ -200,12 +200,12 @@ namespace xo { } auto - Primitive_i64::make_mul2_i64() -> rp + PrimitiveExpr_i64::make_mul2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("mul2_i64", + s_retval = PrimitiveExpr::make("mul2_i64", &mul2_i64, true /*explicit_symbol_def*/, llvmintrinsic::i_mul); @@ -214,12 +214,12 @@ namespace xo { } auto - Primitive_i64::make_div2_i64() -> rp + PrimitiveExpr_i64::make_div2_i64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("div2_i64", + s_retval = PrimitiveExpr::make("div2_i64", &div2_i64, true /*explicit_symbol+def*/, llvmintrinsic::i_sdiv); @@ -229,12 +229,12 @@ namespace xo { // ----- floating-point arithmetic ----- auto - Primitive_f64::make_add2_f64() -> rp + PrimitiveExpr_f64::make_add2_f64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("add2_f64", + s_retval = PrimitiveExpr::make("add2_f64", &add2_f64, true /*explicit_symbol_def*/, llvmintrinsic::fp_add); @@ -243,12 +243,12 @@ namespace xo { } auto - Primitive_f64::make_sub2_f64() -> rp + PrimitiveExpr_f64::make_sub2_f64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("sub2_f64", + s_retval = PrimitiveExpr::make("sub2_f64", &sub2_f64, true /*explicit_symbol_def*/, llvmintrinsic::fp_sub); @@ -257,12 +257,12 @@ namespace xo { } auto - Primitive_f64::make_mul2_f64() -> rp + PrimitiveExpr_f64::make_mul2_f64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("mul2_f64", + s_retval = PrimitiveExpr::make("mul2_f64", &mul2_f64, true /*explicit_symbol_def*/, llvmintrinsic::fp_mul); @@ -271,12 +271,12 @@ namespace xo { } auto - Primitive_f64::make_div2_f64() -> rp + PrimitiveExpr_f64::make_div2_f64() -> rp { - static rp s_retval; + static rp s_retval; if (!s_retval) - s_retval = Primitive::make("div2_f64", + s_retval = PrimitiveExpr::make("div2_f64", &div2_f64, true /*explicit_symbol_def*/, llvmintrinsic::fp_div); @@ -288,4 +288,4 @@ namespace xo { } /*namespace xo*/ -/* end Primitive.cpp */ +/* end PrimitiveExpr.cpp */