From 8c3ecc5bfb24190fee0244a6826bbddf136f9484 Mon Sep 17 00:00:00 2001 From: dos-reis Date: Tue, 18 Nov 2014 02:14:12 +0000 Subject: Add visitor to Dynamic values. --- src/include/sexpr.H | 1 + src/include/vm.H | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) (limited to 'src/include') 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 + inline const S& as(const T& t) { return t; } + template<> struct ValueTrait { 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 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; @@ -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 + void BuiltinFunction::accept(Visitor& v) const { v.visit(*this); } + // ------------------ // -- BasicContext -- // ------------------ -- cgit v1.2.3