Module: Heist::Runtime::Expression
- Included in:
- Binding, Cons, Identifier
- Defined in:
- lib/heist/runtime/data/expression.rb
Overview
Classes may mix in the Expression module to signal that they represent sections of code that may be evaluated. This is mostly a flag module and does not provide much in the way of extensibility, since the evaluator needs to know how to execute all the kinds of expressions you want it to deal with (for reasons such as tail recursion, expressions are not responsible for evaluating themselves).
Instance Attribute Summary collapse
-
#parent ⇒ Object
Returns the value of attribute parent.
Instance Method Summary collapse
-
#eval(scope) ⇒ Object
Returns the result of evaluating the receiving
Expressionin the givenscope. -
#replace(expression) ⇒ Object
Replaces the receiver with
expressionin the receiver’s parent expression.
Instance Attribute Details
#parent ⇒ Object
Returns the value of attribute parent.
11 12 13 |
# File 'lib/heist/runtime/data/expression.rb', line 11 def parent @parent end |
Instance Method Details
#eval(scope) ⇒ Object
Returns the result of evaluating the receiving Expression in the given scope. Works by pushing the receiver and scope onto the runtime stack (could be a Stack or Stackless), which then evaluates the expression using a trampoline.
25 26 27 |
# File 'lib/heist/runtime/data/expression.rb', line 25 def eval(scope) scope.runtime.stack << Frame.new(self, scope) end |
#replace(expression) ⇒ Object
Replaces the receiver with expression in the receiver’s parent expression. This is used as part of the macro expansion process.
15 16 17 18 19 |
# File 'lib/heist/runtime/data/expression.rb', line 15 def replace(expression) return unless @parent @parent.car = expression @parent.hosts(expression) end |