diff options
author | dos-reis <gdr@axiomatics.org> | 2014-11-18 02:14:12 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2014-11-18 02:14:12 +0000 |
commit | 8c3ecc5bfb24190fee0244a6826bbddf136f9484 (patch) | |
tree | 76f4eb23c6badd1ff952f41c2cf6f5ae633df025 /src/include | |
parent | 9e1699c14362f6c8f63354a93125ec8b1f6f1e9c (diff) | |
download | open-axiom-8c3ecc5bfb24190fee0244a6826bbddf136f9484.tar.gz |
Add visitor to Dynamic values.
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 -- // ------------------ |