class Macros::Compiler

Public Instance Methods

collect_defmacros(sexp) click to toggle source
# File lib/macros/compiler.rb, line 6
def collect_defmacros(sexp)
  Hash[
    treefilter(sexp, &method(:macros_node?)).flat_map(&method(:compile_macros))
  ]
end
compile_macro(node) click to toggle source
# File lib/macros/compiler.rb, line 28
def compile_macro(node)
  name, args, body = extract_macro(node)
  [name,
   s(:block,
     s(:send, nil, :lambda),
     s(:args, *args.map { |a| s(:arg, a) }),
     body)]
end
compile_macros(node) click to toggle source
# File lib/macros/compiler.rb, line 24
def compile_macros(node)
  treefilter(node) { |n| smatch?(n, s(:def)) }.map(&method(:compile_macro))
end
extract_macro(node) click to toggle source
# File lib/macros/compiler.rb, line 37
def extract_macro(node)
  name = sfind(node, [0])

  args = sfind(node, [:def, 1, :args, [0]])
  body = sfind(node, [:def, 2])

  [name, args, body]
end
macros_node?(node) click to toggle source
# File lib/macros/compiler.rb, line 20
def macros_node?(node)
  smatch?(node, s(:block, s(:send, nil, :Macros)))
end
reject_defmacros(node) click to toggle source
# File lib/macros/compiler.rb, line 12
def reject_defmacros(node)
  if macros_node?(node)
    s(:begin)
  else
    s(node.type, *node.children.reject(&method(:macros_node?)))
  end
end