1 ;; Testing cons function
8 (cons (list 1) (list 2 3))
17 ;; Testing concat function
22 (concat (list 1 2) (list 3 4))
24 (concat (list 1 2) (list 3 4) (list 5 6))
28 (concat (list) (list))
33 (concat a b (list 5 6))
40 ;; Testing regular quote
48 ;; Testing simple quasiquote
58 ;; Testing quasiquote with lists
65 (quasiquote (1 2 (3 4)))
77 ;; (quasiquote (f () g (h) i (j k) l))
78 ;; =>(f () g (h) i (j k) l)
81 (quasiquote (unquote 7))
87 (quasiquote (unquote a))
91 (quasiquote (1 (unquote a) 3))
93 (def! b (quote (1 "b" "d")))
97 (quasiquote (1 (unquote b) 3))
99 (quasiquote ((unquote 1) (unquote 2)))
102 ;; Quasiquote and environments
103 (let* (x 0) (quasiquote (unquote x)))
106 ;; Testing splice-unquote
107 (def! c (quote (1 "b" "d")))
111 (quasiquote (1 (splice-unquote c) 3))
113 (quasiquote (1 (splice-unquote c)))
115 (quasiquote ((splice-unquote c) 2))
117 (quasiquote ((splice-unquote c) (splice-unquote c)))
118 ;=>(1 "b" "d" 1 "b" "d")
120 ;; Testing symbol equality
121 (= (quote abc) (quote abc))
123 (= (quote abc) (quote abcd))
125 (= (quote abc) "abc")
127 (= "abc" (quote abc))
129 (= "abc" (str (quote abc)))
138 ;; -------- Deferrable Functionality --------
140 ;; Testing ' (quote) reader macro
148 ;; Testing cons and concat with vectors
156 (concat [1 2] (list 3 4) [5 6])
163 ;; -------- Optional Functionality --------
165 ;; Testing ` (quasiquote) reader macro
175 ;; Testing ~ (unquote) reader macro
182 (def! b '(1 "b" "d"))
189 ;; Testing ~@ (splice-unquote) reader macro
190 (def! c '(1 "b" "d"))
199 ;; Testing vec function
212 ;; Testing that vec does not mutate the original list
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)))))))
223 ;; Testing quasiquote with vectors
236 (quasiquote [a [] b [c] d [e f] g])
237 ;=>[a [] b [c] d [e f] g]
239 ;; Testing unquote with vectors
253 ;; Testing splice-unquote with vectors
254 (def! c '(1 "b" "d"))
269 ;; Misplaced unquote or splice-unquote
273 ;=>(0 splice-unquote)
277 ;=>[splice-unquote 0]
279 ;; Debugging quasiquote
280 (quasiquoteexpand nil)
286 (quasiquoteexpand {"a" b})
288 (quasiquoteexpand ())
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))
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 (()))
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))
312 (quasiquoteexpand (unquote 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 [])
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) ()))))))))