Class: Macros::Compiler
- Inherits:
-
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 = (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
|
37
38
39
40
41
42
43
44
|
# File 'lib/macros/compiler.rb', line 37
def (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
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
|