Merge pull request #532 from dubek/vhdl-fix-defmacro
[jackhill/mal.git] / impls / tests / step7_quote.mal
1 ;; Testing cons function
2 (cons 1 (list))
3 ;=>(1)
4 (cons 1 (list 2))
5 ;=>(1 2)
6 (cons 1 (list 2 3))
7 ;=>(1 2 3)
8 (cons (list 1) (list 2 3))
9 ;=>((1) 2 3)
10
11 (def! a (list 2 3))
12 (cons 1 a)
13 ;=>(1 2 3)
14 a
15 ;=>(2 3)
16
17 ;; Testing concat function
18 (concat)
19 ;=>()
20 (concat (list 1 2))
21 ;=>(1 2)
22 (concat (list 1 2) (list 3 4))
23 ;=>(1 2 3 4)
24 (concat (list 1 2) (list 3 4) (list 5 6))
25 ;=>(1 2 3 4 5 6)
26 (concat (concat))
27 ;=>()
28 (concat (list) (list))
29 ;=>()
30
31 (def! a (list 1 2))
32 (def! b (list 3 4))
33 (concat a b (list 5 6))
34 ;=>(1 2 3 4 5 6)
35 a
36 ;=>(1 2)
37 b
38 ;=>(3 4)
39
40 ;; Testing regular quote
41 (quote 7)
42 ;=>7
43 (quote (1 2 3))
44 ;=>(1 2 3)
45 (quote (1 2 (3 4)))
46 ;=>(1 2 (3 4))
47
48 ;; Testing simple quasiquote
49 (quasiquote nil)
50 ;=>nil
51 (quasiquote 7)
52 ;=>7
53 (quasiquote a)
54 ;=>a
55 (quasiquote {"a" b})
56 ;=>{"a" b}
57
58 ;; Testing quasiquote with lists
59 (quasiquote ())
60 ;=>()
61 (quasiquote (1 2 3))
62 ;=>(1 2 3)
63 (quasiquote (a))
64 ;=>(a)
65 (quasiquote (1 2 (3 4)))
66 ;=>(1 2 (3 4))
67 (quasiquote (nil))
68 ;=>(nil)
69 (quasiquote (1 ()))
70 ;=>(1 ())
71 (quasiquote (() 1))
72 ;=>(() 1)
73 (quasiquote (1 () 2))
74 ;=>(1 () 2)
75 (quasiquote (()))
76 ;=>(())
77 ;; (quasiquote (f () g (h) i (j k) l))
78 ;; =>(f () g (h) i (j k) l)
79
80 ;; Testing unquote
81 (quasiquote (unquote 7))
82 ;=>7
83 (def! a 8)
84 ;=>8
85 (quasiquote a)
86 ;=>a
87 (quasiquote (unquote a))
88 ;=>8
89 (quasiquote (1 a 3))
90 ;=>(1 a 3)
91 (quasiquote (1 (unquote a) 3))
92 ;=>(1 8 3)
93 (def! b (quote (1 "b" "d")))
94 ;=>(1 "b" "d")
95 (quasiquote (1 b 3))
96 ;=>(1 b 3)
97 (quasiquote (1 (unquote b) 3))
98 ;=>(1 (1 "b" "d") 3)
99 (quasiquote ((unquote 1) (unquote 2)))
100 ;=>(1 2)
101
102 ;; Quasiquote and environments
103 (let* (x 0) (quasiquote (unquote x)))
104 ;=>0
105
106 ;; Testing splice-unquote
107 (def! c (quote (1 "b" "d")))
108 ;=>(1 "b" "d")
109 (quasiquote (1 c 3))
110 ;=>(1 c 3)
111 (quasiquote (1 (splice-unquote c) 3))
112 ;=>(1 1 "b" "d" 3)
113 (quasiquote (1 (splice-unquote c)))
114 ;=>(1 1 "b" "d")
115 (quasiquote ((splice-unquote c) 2))
116 ;=>(1 "b" "d" 2)
117 (quasiquote ((splice-unquote c) (splice-unquote c)))
118 ;=>(1 "b" "d" 1 "b" "d")
119
120 ;; Testing symbol equality
121 (= (quote abc) (quote abc))
122 ;=>true
123 (= (quote abc) (quote abcd))
124 ;=>false
125 (= (quote abc) "abc")
126 ;=>false
127 (= "abc" (quote abc))
128 ;=>false
129 (= "abc" (str (quote abc)))
130 ;=>true
131 (= (quote abc) nil)
132 ;=>false
133 (= nil (quote abc))
134 ;=>false
135
136 ;>>> deferrable=True
137 ;;
138 ;; -------- Deferrable Functionality --------
139
140 ;; Testing ' (quote) reader macro
141 '7
142 ;=>7
143 '(1 2 3)
144 ;=>(1 2 3)
145 '(1 2 (3 4))
146 ;=>(1 2 (3 4))
147
148 ;; Testing cons and concat with vectors
149
150 (cons 1 [])
151 ;=>(1)
152 (cons [1] [2 3])
153 ;=>([1] 2 3)
154 (cons 1 [2 3])
155 ;=>(1 2 3)
156 (concat [1 2] (list 3 4) [5 6])
157 ;=>(1 2 3 4 5 6)
158 (concat [1 2])
159 ;=>(1 2)
160
161 ;>>> optional=True
162 ;;
163 ;; -------- Optional Functionality --------
164
165 ;; Testing ` (quasiquote) reader macro
166 `7
167 ;=>7
168 `(1 2 3)
169 ;=>(1 2 3)
170 `(1 2 (3 4))
171 ;=>(1 2 (3 4))
172 `(nil)
173 ;=>(nil)
174
175 ;; Testing ~ (unquote) reader macro
176 `~7
177 ;=>7
178 (def! a 8)
179 ;=>8
180 `(1 ~a 3)
181 ;=>(1 8 3)
182 (def! b '(1 "b" "d"))
183 ;=>(1 "b" "d")
184 `(1 b 3)
185 ;=>(1 b 3)
186 `(1 ~b 3)
187 ;=>(1 (1 "b" "d") 3)
188
189 ;; Testing ~@ (splice-unquote) reader macro
190 (def! c '(1 "b" "d"))
191 ;=>(1 "b" "d")
192 `(1 c 3)
193 ;=>(1 c 3)
194 `(1 ~@c 3)
195 ;=>(1 1 "b" "d" 3)
196
197 ;>>> soft=True
198
199 ;; Testing vec function
200
201 (vec (list))
202 ;=>[]
203 (vec (list 1))
204 ;=>[1]
205 (vec (list 1 2))
206 ;=>[1 2]
207 (vec [])
208 ;=>[]
209 (vec [1 2])
210 ;=>[1 2]
211
212 ;; Testing that vec does not mutate the original list
213 (def! a (list 1 2))
214 (vec a)
215 ;=>[1 2]
216 a
217 ;=>(1 2)
218
219 ;; Test quine
220 ((fn* (q) (quasiquote ((unquote q) (quote (unquote q))))) (quote (fn* (q) (quasiquote ((unquote q) (quote (unquote q)))))))
221 ;=>((fn* (q) (quasiquote ((unquote q) (quote (unquote q))))) (quote (fn* (q) (quasiquote ((unquote q) (quote (unquote q)))))))
222
223 ;; Testing quasiquote with vectors
224 (quasiquote [])
225 ;=>[]
226 (quasiquote [[]])
227 ;=>[[]]
228 (quasiquote [()])
229 ;=>[()]
230 (quasiquote ([]))
231 ;=>([])
232 (def! a 8)
233 ;=>8
234 `[1 a 3]
235 ;=>[1 a 3]
236 (quasiquote [a [] b [c] d [e f] g])
237 ;=>[a [] b [c] d [e f] g]
238
239 ;; Testing unquote with vectors
240 `[~a]
241 ;=>[8]
242 `[(~a)]
243 ;=>[(8)]
244 `([~a])
245 ;=>([8])
246 `[a ~a a]
247 ;=>[a 8 a]
248 `([a ~a a])
249 ;=>([a 8 a])
250 `[(a ~a a)]
251 ;=>[(a 8 a)]
252
253 ;; Testing splice-unquote with vectors
254 (def! c '(1 "b" "d"))
255 ;=>(1 "b" "d")
256 `[~@c]
257 ;=>[1 "b" "d"]
258 `[(~@c)]
259 ;=>[(1 "b" "d")]
260 `([~@c])
261 ;=>([1 "b" "d"])
262 `[1 ~@c 3]
263 ;=>[1 1 "b" "d" 3]
264 `([1 ~@c 3])
265 ;=>([1 1 "b" "d" 3])
266 `[(1 ~@c 3)]
267 ;=>[(1 1 "b" "d" 3)]
268
269 ;; Misplaced unquote or splice-unquote
270 `(0 unquote)
271 ;=>(0 unquote)
272 `(0 splice-unquote)
273 ;=>(0 splice-unquote)
274 `[unquote 0]
275 ;=>[unquote 0]
276 `[splice-unquote 0]
277 ;=>[splice-unquote 0]
278
279 ;; Debugging quasiquote
280 (quasiquoteexpand nil)
281 ;=>nil
282 (quasiquoteexpand 7)
283 ;=>7
284 (quasiquoteexpand a)
285 ;=>(quote a)
286 (quasiquoteexpand {"a" b})
287 ;=>(quote {"a" b})
288 (quasiquoteexpand ())
289 ;=>()
290 (quasiquoteexpand (1 2 3))
291 ;=>(cons 1 (cons 2 (cons 3 ())))
292 (quasiquoteexpand (a))
293 ;=>(cons (quote a) ())
294 (quasiquoteexpand (1 2 (3 4)))
295 ;=>(cons 1 (cons 2 (cons (cons 3 (cons 4 ())) ())))
296 (quasiquoteexpand (nil))
297 ;=>(cons nil ())
298 (quasiquoteexpand (1 ()))
299 ;=>(cons 1 (cons () ()))
300 (quasiquoteexpand (() 1))
301 ;=>(cons () (cons 1 ()))
302 (quasiquoteexpand (1 () 2))
303 ;=>(cons 1 (cons () (cons 2 ())))
304 (quasiquoteexpand (()))
305 ;=>(cons () ())
306 (quasiquoteexpand (f () g (h) i (j k) l))
307 ;=>(cons (quote f) (cons () (cons (quote g) (cons (cons (quote h) ()) (cons (quote i) (cons (cons (quote j) (cons (quote k) ())) (cons (quote l) ())))))))
308 (quasiquoteexpand (unquote 7))
309 ;=>7
310 (quasiquoteexpand a)
311 ;=>(quote a)
312 (quasiquoteexpand (unquote a))
313 ;=>a
314 (quasiquoteexpand (1 a 3))
315 ;=>(cons 1 (cons (quote a) (cons 3 ())))
316 (quasiquoteexpand (1 (unquote a) 3))
317 ;=>(cons 1 (cons a (cons 3 ())))
318 (quasiquoteexpand (1 b 3))
319 ;=>(cons 1 (cons (quote b) (cons 3 ())))
320 (quasiquoteexpand (1 (unquote b) 3))
321 ;=>(cons 1 (cons b (cons 3 ())))
322 (quasiquoteexpand ((unquote 1) (unquote 2)))
323 ;=>(cons 1 (cons 2 ()))
324 (quasiquoteexpand (a (splice-unquote (b c)) d))
325 ;=>(cons (quote a) (concat (b c) (cons (quote d) ())))
326 (quasiquoteexpand (1 c 3))
327 ;=>(cons 1 (cons (quote c) (cons 3 ())))
328 (quasiquoteexpand (1 (splice-unquote c) 3))
329 ;=>(cons 1 (concat c (cons 3 ())))
330 (quasiquoteexpand (1 (splice-unquote c)))
331 ;=>(cons 1 (concat c ()))
332 (quasiquoteexpand ((splice-unquote c) 2))
333 ;=>(concat c (cons 2 ()))
334 (quasiquoteexpand ((splice-unquote c) (splice-unquote c)))
335 ;=>(concat c (concat c ()))
336 (quasiquoteexpand [])
337 ;=>(vec ())
338 (quasiquoteexpand [[]])
339 ;=>(vec (cons (vec ()) ()))
340 (quasiquoteexpand [()])
341 ;=>(vec (cons () ()))
342 (quasiquoteexpand ([]))
343 ;=>(cons (vec ()) ())
344 (quasiquoteexpand [1 a 3])
345 ;=>(vec (cons 1 (cons (quote a) (cons 3 ()))))
346 (quasiquoteexpand [a [] b [c] d [e f] g])
347 ;=>(vec (cons (quote a) (cons (vec ()) (cons (quote b) (cons (vec (cons (quote c) ())) (cons (quote d) (cons (vec (cons (quote e) (cons (quote f) ()))) (cons (quote g) ()))))))))