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