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