class Macros::Expander
Public Class Methods
new(macros)
click to toggle source
# File lib/macros/expander.rb, line 6 def initialize(macros) @macros = macros end
Public Instance Methods
macro_block?(node)
click to toggle source
foo(1,2) { some_more_code }
>> (block >> (send nil :foo >> (int 1) >> (int 2)) >> (args) >> (send nil :some_more_code)))
# File lib/macros/expander.rb, line 29 def macro_block?(node) # send with block node.type == :block && # target is implicit self sfind(node, [:block, 0, :send, 0]).nil? && # known macro @macros.key?(sfind(node, [:block, 0, :send, 1])) end
macroexpand(sexp)
click to toggle source
# File lib/macros/expander.rb, line 10 def macroexpand(sexp) treemap(sexp, &method(:macroexpand_1)) end
macroexpand_1(node)
click to toggle source
# File lib/macros/expander.rb, line 14 def macroexpand_1(node) return node unless macro_block?(node) macro = seval @macros[sfind(node, [:block, 0, :send, 1])] body = sfind(node, [:block, 2]) macro.call(body) end