-
Notifications
You must be signed in to change notification settings - Fork 237
/
test_onlisp.nu
120 lines (98 loc) · 3.48 KB
/
test_onlisp.nu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
;; test_onlisp.nu
;; more tests for Nu macros.
;;
;; Copyright (c) 2008 Jeff Buck
;; Some macro tests adapted from Paul Graham's book OnLisp
(class TestOnLisp is NuTestCase
(- (id) testNil is
(macro nil! (var)
`(set ,var nil))
(set newBody (macrox (nil! a)))
(assert_equal "(set a nil)" (newBody stringValue))
(set a 5)
(nil! a)
(assert_equal nil a))
(- (id) testOurWhen is
(macro our-when (test *body)
`(if ,test
(progn
,@*body)))
(set n 1)
(our-when (< n 5)
(set a "a is defined")
(set n (+ n 1))
)
(assert_equal "a is defined" a)
(set n 6)
(our-when (< n 5)
(set b "b is defined"))
(assert_throws "NuUndefinedSymbol" b))
(- (id) testOurAnd is
(macro our-and (*args)
(case (*args length)
(0 t)
(1 (car *args))
(else
`(if ,(car *args)
(our-and ,@(cdr *args)))
)))
(assert_equal 3 (our-and 1 2 (set m 3)))
; Make sure namespace scoping is correct
(assert_equal 3 m)
(assert_equal nil (our-and 1 nil (set n 1)))
; Make sure short circuit boolean logic is working
(assert_throws "NuUndefinedSymbol" n))
(- (id) testOurSum is
(macro our-sum (*args)
`(+ ,@*args))
(assert_equal 10 (our-sum 1 2 3 4)))
(- (id) testOurFor is
(macro myfor ((var start stop) *body)
`(let ((,var ,start)
(__gstop ,stop)) ;; Only evaluate stop once
(while (<= ,var __gstop)
,@*body
(set ,var (+ ,var 1)))))
(set var 0)
(myfor (i 1 10)
(set var (+ var i)))
(assert_equal 55 var)
;; Make sure we didn't pollute our context
(assert_throws "NuUndefinedSymbol" i)
;; Make sure evals work in the parameter list
(set var 0)
(set n 20)
(myfor (i (* 1 1) (- n 10))
(set var (+ var i)))
(assert_equal 55 var)
(macro inc! (n) `(set ,n (+ ,n 1)))
(set var 0)
(set n 9)
;; Make sure we only eval "stop" one time
;; otherwise, we'd have an infinite loop
(myfor (i 1 (inc! n))
(set var (+ var i)))
(assert_equal 55 var))
(- (id) testOurApply is
(macro our-apply (f *data)
`(eval (cons ,f ,@*data)))
(assert_equal 6 (our-apply + '(1 2 3))))
(- (id) fixme_testOurLet is
(macro mylet (bindings *body)
`((do ,(bindings map:
(do (x) (car x)))
,@*body)
,@(bindings map:
(do (x) (second x)))))
(assert_equal 3
(mylet ((x 1) (y 2))
(+ x y))))
(- (id) testNumericIf is
(macro numeric-if (expr pos zero neg)
`(let ((__expr ,expr))
(cond
((> __expr 0) ,pos)
((eq __expr 0) ,zero)
(t ,neg))))
(assert_equal '(p z n)
('(1 0 -1) map: (do (n) (numeric-if n 'p 'z 'n))))))