Class: Macros::Compiler

Inherits:
Object
  • Object
show all
Includes:
Sexp
Defined in:
lib/macros/compiler.rb

Instance Method Summary collapse

Methods included from Sexp

#node?, #s, #seval, #sfind, #smatch?, #treefilter, #treemap

Instance Method Details

#collect_defmacros(sexp) ⇒ Object



6
7
8
9
10
# 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) ⇒ Object



28
29
30
31
32
33
34
35
# 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) ⇒ Object



24
25
26
# 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) ⇒ Object



37
38
39
40
41
42
43
44
# 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) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/macros/compiler.rb', line 20

def macros_node?(node)
  smatch?(node, s(:block, s(:send, nil, :Macros)))
end

#reject_defmacros(node) ⇒ Object



12
13
14
15
16
17
18
# 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