Module: SByC::CodeTree::FunctionalEval

Defined in:
lib/sbyc/codetree/eval/functional_eval.rb

Class Method Summary collapse

Class Method Details

.functional_compile(ast, receiver_object = "receiver", scope_object = "scope", scope_method = :[]) ⇒ Object

Generates code for a functional evaluation



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/sbyc/codetree/eval/functional_eval.rb', line 6

def functional_compile(ast, receiver_object = "receiver", scope_object = "scope", scope_method = :[])
  ast.visit{|node, collected|
    case func = node.function
      when :_
        collected.first.inspect
      when :'?'
        if scope_method == :[]
          "#{scope_object}[#{collected.join(', ')}]"
        else
          "#{scope_object}.#{scope_method}(#{collected.join(', ')})"
        end
      else
        "#{receiver_object}.#{func}(#{collected.join(', ')})"
    end
  }
end

.functional_eval(ast, receiver, scope = {}, scope_method = :[]) ⇒ Object

Evaluates this AST with an object style.



31
32
33
# File 'lib/sbyc/codetree/eval/functional_eval.rb', line 31

def functional_eval(ast, receiver, scope = {}, scope_method = :[]) 
  functional_proc(ast, scope_method).call(receiver, scope)
end

.functional_proc(ast, scope_method = :[]) ⇒ Object

Generates a lambda function for functional evaluation



25
26
27
# File 'lib/sbyc/codetree/eval/functional_eval.rb', line 25

def functional_proc(ast, scope_method = :[])
  ::Kernel.eval("::Kernel.lambda{|receiver, scope| #{functional_compile(ast, 'receiver', 'scope', scope_method)}}")
end