From dd64b61e51fe3b9d3f818a1a5c2e6c5100e3ba43 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 30 Jan 2026 12:41:09 -0500 Subject: [PATCH] xo-reader2: + assemble lambda function type in DLambdaSsm --- include/xo/expression2/DLambdaExpr.hpp | 8 +++++++ src/expression2/DLambdaExpr.cpp | 29 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/include/xo/expression2/DLambdaExpr.hpp b/include/xo/expression2/DLambdaExpr.hpp index bd9ff2c5..14be115f 100644 --- a/include/xo/expression2/DLambdaExpr.hpp +++ b/include/xo/expression2/DLambdaExpr.hpp @@ -47,6 +47,14 @@ namespace xo { const DUniqueString * name, DLocalSymtab * local_symtab, obj body); + + /** create type description for lambda with arguments described by @p symtab + * and return type @p return_td. + * Load-bearing for DLambdaSsm in xo-reader2/ + **/ + static TypeDescr assemble_lambda_td(DLocalSymtab * symtab, + TypeDescr return_td); + ///@} /** @defgroup scm-lambdaexpr-methods **/ ///@{ diff --git a/src/expression2/DLambdaExpr.cpp b/src/expression2/DLambdaExpr.cpp index fec939ac..a27e788b 100644 --- a/src/expression2/DLambdaExpr.cpp +++ b/src/expression2/DLambdaExpr.cpp @@ -14,6 +14,8 @@ namespace xo { using xo::print::APrintable; using xo::facet::FacetRegistry; using xo::reflect::TypeDescr; + using xo::reflect::TypeDescrBase; + using xo::reflect::FunctionTdxInfo; using xo::reflect::typeseq; namespace scm { @@ -82,6 +84,33 @@ namespace xo { body); } + TypeDescr + DLambdaExpr::assemble_lambda_td(DLocalSymtab * symtab, + TypeDescr return_td) + { + assert(return_td); + + std::vector arg_td_v; + { + DLocalSymtab::size_type z = symtab->size(); + + arg_td_v.reserve(z); + + for (DLocalSymtab::size_type i = 0; i < z; ++i) { + auto param = symtab->lookup_var(Binding::local(i)); + + assert(param); + arg_td_v.push_back(param->valuetype()); + } + } + + auto function_tdx = FunctionTdxInfo(return_td, arg_td_v, false /*!is_noexcept*/); + + TypeDescr lambda_td = TypeDescrBase::require_by_fn_info(function_tdx); + + return lambda_td; + } + exprtype DLambdaExpr::extype() const noexcept { return exprtype::lambda;