diff options
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/sexpr.H | 1 | ||||
| -rw-r--r-- | src/include/vm.H | 38 |
2 files changed, 35 insertions, 4 deletions
diff --git a/src/include/sexpr.H b/src/include/sexpr.H index 82dba2a3..6920e436 100644 --- a/src/include/sexpr.H +++ b/src/include/sexpr.H @@ -280,6 +280,7 @@ namespace OpenAxiom { using base::rend; using base::size; using base::empty; + using base::front; ListSyntax(); ListSyntax(const base&, bool); diff --git a/src/include/vm.H b/src/include/vm.H index 2c1eafde..3ee093ea 100644 --- a/src/include/vm.H +++ b/src/include/vm.H @@ -217,10 +217,16 @@ namespace OpenAxiom { // ------------- // Any internal value is of a class derived from this. internal_type Dynamic { + struct Visitor; virtual ~Dynamic(); - virtual void format_on(std::ostream&) const = 0; + virtual void accept(Visitor&) const = 0; }; + // Provide an S-view of a T-typed expression, assuming the type T + // derives from S. + template<typename S, typename T> + inline const S& as(const T& t) { return t; } + template<> struct ValueTrait<Dynamic> { enum Tag : ValueBits { tag = 0x6 }; @@ -420,7 +426,7 @@ namespace OpenAxiom { Package* package; SymbolAttribute attributes; explicit Symbol(InternedString); - void format_on(std::ostream&) const override; + void accept(Visitor&) const override; bool has(SymbolAttribute x) const { return (attributes & x) == x; } }; @@ -456,6 +462,14 @@ namespace OpenAxiom { sym->function = fun; return fun; } + + // -- Argument binding as value. + // Binding a parameter to a value in a call. + struct Binding : Dynamic { + Symbol* symbol; + Value value; + void accept(Visitor&) const override; + }; // -- Environments. struct Environment { @@ -482,7 +496,8 @@ namespace OpenAxiom { std::set<Symbol, CmpByName> symbols; explicit Package(InternedString); - void format_on(std::ostream&) const override; + void accept(Visitor&) const override; + void format_on(std::ostream&) const; Symbol* make_symbol(InternedString); Symbol* find_symbol(InternedString); }; @@ -495,7 +510,7 @@ namespace OpenAxiom { Value type; FunctionBase(const Symbol* n, Value t = Value::nil) : name(n), type(t) { } - void format_on(std::ostream&) const override; + void accept(Visitor&) const override; }; // ------------------------ @@ -517,6 +532,7 @@ namespace OpenAxiom { BuiltinFunction(const Symbol* n, Code c) : FunctionBase(n), code(c) { } + void accept(Visitor&) const override; }; using NullaryOperator = BuiltinFunction<NullaryCode>; @@ -541,6 +557,20 @@ namespace OpenAxiom { } }; + // -- Dynamic::Visitor -- + struct Dynamic::Visitor { + virtual void visit(const Symbol&) = 0; + virtual void visit(const Binding&) = 0; + virtual void visit(const Package&) = 0; + virtual void visit(const FunctionBase&) = 0; + virtual void visit(const NullaryOperator&); + virtual void visit(const UnaryOperator&); + virtual void visit(const BinaryOperator&); + }; + + template<typename Code> + void BuiltinFunction<Code>::accept(Visitor& v) const { v.visit(*this); } + // ------------------ // -- BasicContext -- // ------------------ |
