xo-expression: + Lambda (function definitions)

This commit is contained in:
Roland Conybeare 2024-06-13 17:05:38 -04:00
commit 20b23b50fc
4 changed files with 67 additions and 0 deletions

View file

@ -0,0 +1,44 @@
/** @file Lambda.hpp
*
* Author: Roland Conybeare
**/
#pragma once
#include "Expression.hpp"
#include <vector>
#include <string>
//#include <cstdint>
namespace xo {
namespace ast {
/** @class Lambda
* @brief abstract syntax tree for a function definition
*
**/
class Lambda : public Expression {
public:
/** @p argv Formal parameters, in left-to-right order
* @p body Expression for body of this function
**/
Lambda(const std::vector<std::string> & argv,
const ref::rp<Expression> & body)
: Expression(exprtype::lambda), argv_{argv}, body_{body} {}
const std::vector<std::string> & argv() const { return argv_; }
const ref::rp<Expression> & body() const { return body_; }
// ----- Expression -----
virtual void display(std::ostream & os) const override;
private:
/** formal argument names **/
std::vector<std::string> argv_;
/** function body **/
ref::rp<Expression> body_;
}; /*Lambda*/
} /*namespace ast*/
} /*namespace xo*/
/** end Lambda.hpp **/

View file

@ -24,6 +24,8 @@ namespace xo {
primitive, primitive,
/** function call **/ /** function call **/
apply, apply,
/** function definition **/
lambda,
/** not an expression. comes last, counts entries **/ /** not an expression. comes last, counts entries **/
n_expr n_expr
@ -37,6 +39,7 @@ namespace xo {
case exprtype::constant: return "constant"; case exprtype::constant: return "constant";
case exprtype::primitive: return "primitive"; case exprtype::primitive: return "primitive";
case exprtype::apply: return "apply"; case exprtype::apply: return "apply";
case exprtype::lambda: return "lambda";
default: break; default: break;
} }

View file

@ -4,6 +4,7 @@ set(SELF_LIB xo_expression)
set(SELF_SRCS set(SELF_SRCS
Expression.cpp Expression.cpp
Apply.cpp Apply.cpp
Lambda.cpp
#init_reflect.cpp #init_reflect.cpp
) )

19
src/expression/Lambda.cpp Normal file
View file

@ -0,0 +1,19 @@
/* @file Lambda.cpp */
#include "Lambda.hpp"
#include "xo/indentlog/print/vector.hpp"
namespace xo {
namespace ast {
void
Lambda::display(std::ostream & os) const {
os << "<Lambda"
<< xtag("argv", argv_)
<< xtag("body", body_)
<< ">";
} /*display*/
} /*namespace ast*/
} /*namespace xo*/
/* end Lambda.cpp */