aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2014-11-18 02:14:12 +0000
committerdos-reis <gdr@axiomatics.org>2014-11-18 02:14:12 +0000
commit8c3ecc5bfb24190fee0244a6826bbddf136f9484 (patch)
tree76f4eb23c6badd1ff952f41c2cf6f5ae633df025 /src/include
parent9e1699c14362f6c8f63354a93125ec8b1f6f1e9c (diff)
downloadopen-axiom-8c3ecc5bfb24190fee0244a6826bbddf136f9484.tar.gz
Add visitor to Dynamic values.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/sexpr.H1
-rw-r--r--src/include/vm.H38
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 --
// ------------------