1 # Hay Metaprogramming
2
3 #### Conditional Inside Blocks
4 shopt --set oil:all
5
6 hay define Rule
7
8 const DEBUG = true
9
10 Rule one {
11 if (DEBUG) {
12 deps = 'foo'
13 } else {
14 deps = 'bar'
15 }
16 }
17
18 json write (_hay()) | jq '.children[0]' > actual.txt
19
20 diff -u - actual.txt <<EOF
21 {
22 "type": "Rule",
23 "args": [
24 "one"
25 ],
26 "children": [],
27 "attrs": {
28 "deps": "foo"
29 }
30 }
31 EOF
32
33 ## STDOUT:
34 ## END
35
36
37 #### Conditional Outside Block
38 shopt --set oil:all
39
40 hay define Rule
41
42 const DEBUG = true
43
44 if (DEBUG) {
45 Rule two {
46 deps = 'spam'
47 }
48 } else {
49 Rule two {
50 deps = 'bar'
51 }
52 }
53
54 json write (_hay()) | jq '.children[0].attrs' > actual.txt
55
56 diff -u - actual.txt <<EOF
57 {
58 "deps": "spam"
59 }
60 EOF
61
62 ## STDOUT:
63 ## END
64
65
66 #### Iteration Inside Block
67 shopt --set oil:all
68
69 hay define Rule
70
71 Rule foo {
72 var d = {}
73 # private var with _
74 for name_ in spam eggs ham {
75 setvar d[name_] = true
76 }
77 }
78
79 json write (_hay()) | jq '.children[0].attrs' > actual.txt
80
81 # For loop name leaks! Might want to make it "name_" instead!
82
83 #cat actual.txt
84
85 diff -u - actual.txt <<EOF
86 {
87 "d": {
88 "spam": true,
89 "eggs": true,
90 "ham": true
91 }
92 }
93 EOF
94
95
96 ## STDOUT:
97 ## END
98
99
100 #### Iteration Outside Block
101 shopt --set oil:all
102
103 hay define Rule
104
105 for name in spam eggs ham {
106 Rule $name {
107 path = "/usr/bin/$name"
108 }
109 }
110
111 json write (_hay()) | jq '.children[].attrs' > actual.txt
112
113 diff -u - actual.txt <<EOF
114 {
115 "path": "/usr/bin/spam"
116 }
117 {
118 "path": "/usr/bin/eggs"
119 }
120 {
121 "path": "/usr/bin/ham"
122 }
123 EOF
124
125 ## STDOUT:
126 ## END
127
128
129 #### Proc Inside Block
130 shopt --set oil:all
131
132 hay define rule # lower case allowed
133
134 proc p(name, :out) {
135 echo 'p'
136 setref out = name
137 }
138
139 rule hello {
140 var eggs = ''
141 var bar = ''
142
143 p spam :eggs
144 p foo :bar
145 }
146
147 json write (_hay()) | jq '.children[0].attrs' > actual.txt
148
149 diff -u - actual.txt <<EOF
150 {
151 "eggs": "spam",
152 "bar": "foo"
153 }
154 EOF
155
156 ## STDOUT:
157 p
158 p
159 ## END
160
161
162
163 #### Proc That Defines Block
164 shopt --set oil:all
165
166 hay define Rule
167
168 proc myrule(name) {
169
170 # Each haynode has its own scope. But then it can't see the args! Oops.
171 # Is there a better way to do this?
172
173 shopt --set dynamic_scope {
174 Rule $name {
175 path = "/usr/bin/$name"
176 }
177 }
178 }
179
180 myrule spam
181 myrule eggs
182 myrule ham
183
184 json write (_hay()) | jq '.children[].attrs' > actual.txt
185
186 diff -u - actual.txt <<EOF
187 {
188 "path": "/usr/bin/spam"
189 }
190 {
191 "path": "/usr/bin/eggs"
192 }
193 {
194 "path": "/usr/bin/ham"
195 }
196 EOF
197
198 ## STDOUT:
199 ## END
200