nendo 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/emacs/nendo-mode.el +2 -0
- data/lib/init.nnd +51 -35
- data/lib/init.nndc +3371 -2920
- data/lib/nendo.rb +463 -194
- data/lib/srfi-2.nndc +48 -165
- data/lib/srfi-26.nndc +142 -511
- data/lib/text/html-lite.nndc +23 -1
- data/lib/util/combinations.nnd +290 -0
- data/lib/util/combinations.nndc +7218 -0
- data/lib/util/list.nndc +138 -387
- data/lib/util/match.nnd +672 -0
- data/lib/util/match.nndc +81024 -0
- data/test/match-test.nnd +186 -0
- data/test/nendo-util-test.nnd +5 -7
- data/test/nendo_spec.rb +697 -235
- data/test/syntax_spec.rb +561 -52
- data/test/util-combinations-test.nnd +383 -0
- metadata +9 -4
- data/example/scratch.nnd +0 -119
data/test/match-test.nnd
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
;;-*- mode: nendo; syntax: scheme -*-;;
|
2
|
+
;;
|
3
|
+
;; match-test.nnd - test suite for util.match
|
4
|
+
;;
|
5
|
+
;; This file ported from chibi-scheme 0.3 by Alex Shinn.
|
6
|
+
;;
|
7
|
+
|
8
|
+
(use nendo.test)
|
9
|
+
(use util.match)
|
10
|
+
;;(use util.match-expanded)
|
11
|
+
|
12
|
+
(test-start "match")
|
13
|
+
(test-section "match")
|
14
|
+
|
15
|
+
(define-syntax match-test*
|
16
|
+
(syntax-rules ()
|
17
|
+
((_ title code result)
|
18
|
+
(test* title result code))))
|
19
|
+
|
20
|
+
(define-syntax pending*
|
21
|
+
(syntax-rules ()
|
22
|
+
((_ title code result)
|
23
|
+
(printf "(pending) [%s]\n" title))))
|
24
|
+
|
25
|
+
|
26
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
27
|
+
;; run tests
|
28
|
+
(match-test* "any" (match 'any (_ 'ok)) 'ok)
|
29
|
+
(match-test* "symbol" (match 'ok (x x)) 'ok)
|
30
|
+
(match-test* "number" (match 28 (28 'ok)) 'ok)
|
31
|
+
(match-test* "string" (match "good" ("bad" 'fail) ("good" 'ok)) 'ok)
|
32
|
+
(match-test* "literal symbol" (match 'good ('bad 'fail) ('good 'ok)) 'ok)
|
33
|
+
(match-test* "null" (match '() (() 'ok)) 'ok)
|
34
|
+
(match-test* "pair" (match '(ok) ((x) x)) 'ok)
|
35
|
+
(match-test* "vector" (match '#(ok) (#(x) x)) 'ok)
|
36
|
+
(match-test* "any doubled" (match '(1 2) ((_ _) 'ok)) 'ok)
|
37
|
+
(match-test* "and empty" (match '(o k) ((and) 'ok)) 'ok)
|
38
|
+
(match-test* "and single" (match 'ok ((and x) x)) 'ok)
|
39
|
+
(match-test* "and double" (match 'ok ((and (? symbol?) y) 'ok)) 'ok)
|
40
|
+
(match-test* "or empty" (match '(o k) ((or) 'fail) (else 'ok)) 'ok)
|
41
|
+
(match-test* "or single" (match 'ok ((or x) 'ok)) 'ok)
|
42
|
+
(match-test* "or double" (match 'ok ((or (? symbol? y) y) y)) 'ok)
|
43
|
+
(match-test* "not" (match 28 ((not (a . b)) 'ok)) 'ok)
|
44
|
+
(match-test* "pred" (match 28 ((? number?) 'ok)) 'ok)
|
45
|
+
(match-test* "named pred" (match 28 ((? number? x) (+ x 1))) 29)
|
46
|
+
(match-test* "duplicate symbols pass" (match '(ok . ok) ((x . x) x)) 'ok)
|
47
|
+
(match-test* "duplicate symbols fail" (match '(ok . bad) ((x . x) 'bad) (else 'ok)) 'ok)
|
48
|
+
(match-test* "duplicate symbols samth" (match '(ok . ok) ((x . 'bad) x) (('ok . x) x)) 'ok)
|
49
|
+
|
50
|
+
(match-test* "ellipses"
|
51
|
+
(match '((a . 1) (b . 2) (c . 3))
|
52
|
+
(((x . y) ___) (list x y)))
|
53
|
+
'((a b c) (1 2 3)))
|
54
|
+
|
55
|
+
(match-test* "real ellipses"
|
56
|
+
(match '((a . 1) (b . 2) (c . 3))
|
57
|
+
(((x . y) ...) (list x y)))
|
58
|
+
'((a b c) (1 2 3)))
|
59
|
+
|
60
|
+
(match-test* "vector ellipses"
|
61
|
+
(match '#(1 2 3 (a . 1) (b . 2) (c . 3))
|
62
|
+
(#(a b c (hd . tl) ...) (list a b c hd tl)))
|
63
|
+
'(1 2 3 (a b c) (1 2 3)))
|
64
|
+
|
65
|
+
(match-test* "pred ellipses"
|
66
|
+
(match '(1 2 3)
|
67
|
+
(((? odd? n) ___) n)
|
68
|
+
(((? number? n) ___) n))
|
69
|
+
'(1 2 3))
|
70
|
+
|
71
|
+
(match-test* "failure continuation"
|
72
|
+
(match '(1 2)
|
73
|
+
((a . b) (=> next) (if (even? a) 'fail (next)))
|
74
|
+
((a . b) 'ok))
|
75
|
+
'ok)
|
76
|
+
|
77
|
+
(match-test* "let"
|
78
|
+
(match-let ((x 'ok) (y '(o k)))
|
79
|
+
y)
|
80
|
+
'(o k))
|
81
|
+
|
82
|
+
(match-test* "let*"
|
83
|
+
(match-let* ((x 'f) (y 'o) ((z w) (list y x)))
|
84
|
+
(list x y z w))
|
85
|
+
'(f o o f))
|
86
|
+
|
87
|
+
(match-test* "getter car"
|
88
|
+
(match '(1 . 2) (((get! a) . b) (list (a) b)))
|
89
|
+
'(1 2))
|
90
|
+
|
91
|
+
(match-test* "getter cdr"
|
92
|
+
(match '(1 . 2) ((a . (get! b)) (list a (b))))
|
93
|
+
'(1 2))
|
94
|
+
|
95
|
+
(match-test* "getter vector"
|
96
|
+
(match '#(1 2 3) (#((get! a) b c) (list (a) b c)))
|
97
|
+
'(1 2 3))
|
98
|
+
|
99
|
+
(match-test* "setter car"
|
100
|
+
(let ((x (cons 1 2)))
|
101
|
+
(match x (((set! a) . b) (a 3)))
|
102
|
+
x)
|
103
|
+
'(3 . 2))
|
104
|
+
|
105
|
+
(match-test* "setter cdr"
|
106
|
+
(let ((x (cons 1 2)))
|
107
|
+
(match x ((a . (set! b)) (b 3)))
|
108
|
+
x)
|
109
|
+
'(1 . 3))
|
110
|
+
|
111
|
+
(match-test* "setter vector"
|
112
|
+
(let ((x (vector 1 2 3)))
|
113
|
+
(match x (#(a (set! b) c) (b 0)))
|
114
|
+
x)
|
115
|
+
'#(1 0 3))
|
116
|
+
|
117
|
+
(match-test* "single tail"
|
118
|
+
(match '((a . 1) (b . 2) (c . 3))
|
119
|
+
(((x . y) ... last) (list x y last)))
|
120
|
+
'((a b) (1 2) (c . 3)))
|
121
|
+
|
122
|
+
(match-test* "single tail 2"
|
123
|
+
(match '((a . 1) (b . 2) 3)
|
124
|
+
(((x . y) ... last) (list x y last)))
|
125
|
+
'((a b) (1 2) 3))
|
126
|
+
|
127
|
+
(match-test* "multiple tail"
|
128
|
+
(match '((a . 1) (b . 2) (c . 3) (d . 4) (e . 5))
|
129
|
+
(((x . y) ... u v w) (list x y u v w)))
|
130
|
+
'((a b) (1 2) (c . 3) (d . 4) (e . 5)))
|
131
|
+
|
132
|
+
(match-test* "Riastradh quasiquote"
|
133
|
+
(match '(1 2 3) (`(1 ,b ,c) (list b c)))
|
134
|
+
'(2 3))
|
135
|
+
|
136
|
+
(match-test* "trivial tree search"
|
137
|
+
(match '(1 2 3) ((_ *** (a b c)) (list a b c)))
|
138
|
+
'(1 2 3))
|
139
|
+
|
140
|
+
(match-test* "simple tree search"
|
141
|
+
(match '(x (1 2 3)) ((_ *** (a b c)) (list a b c)))
|
142
|
+
'(1 2 3))
|
143
|
+
|
144
|
+
(match-test* "deep tree search"
|
145
|
+
(match '(x (x (x (1 2 3)))) ((_ *** (a b c)) (list a b c)))
|
146
|
+
'(1 2 3))
|
147
|
+
|
148
|
+
(match-test* "non-tail tree search"
|
149
|
+
(match '(x (x (x a b c (1 2 3) d e f))) ((_ *** (a b c)) (list a b c)))
|
150
|
+
'(1 2 3))
|
151
|
+
|
152
|
+
(match-test* "restricted tree search"
|
153
|
+
(match '(x (x (x a b c (1 2 3) d e f))) (('x *** (a b c)) (list a b c)))
|
154
|
+
'(1 2 3))
|
155
|
+
|
156
|
+
(match-test* "fail restricted tree search"
|
157
|
+
(match '(x (y (x a b c (1 2 3) d e f)))
|
158
|
+
(('x *** (a b c)) (list a b c))
|
159
|
+
(else #f))
|
160
|
+
#f)
|
161
|
+
|
162
|
+
;; /home2/home/kiyoka/work/github/nendo/lib/nendo.rb:2317: stack level too deep (SystemStackError)
|
163
|
+
(match-test* "sxml tree search"
|
164
|
+
(match '(p (ul (li a (b c) (a (^ (href . "http://synthcode.com/")) "synthcode") d e f)))
|
165
|
+
(((or 'p 'ul 'li 'b) *** ('a ('^ attrs ...) text ...))
|
166
|
+
(list attrs text))
|
167
|
+
(else #f))
|
168
|
+
'(((href . "http://synthcode.com/")) ("synthcode")))
|
169
|
+
|
170
|
+
;; /home2/home/kiyoka/work/github/nendo/lib/nendo.rb:2317: stack level too deep (SystemStackError)
|
171
|
+
(match-test* "failed sxml tree search"
|
172
|
+
(match '(p (ol (li a (b c) (a (^ (href . "http://synthcode.com/")) "synthcode") d e f)))
|
173
|
+
(((or 'p 'ul 'li 'b) *** ('a ('^ attrs ...) text ...))
|
174
|
+
(list attrs text))
|
175
|
+
(else #f))
|
176
|
+
#f)
|
177
|
+
|
178
|
+
;; ./test/match-test.nnd:192: Error: undefined variable _tag (NameError)
|
179
|
+
(match-test* "collect tree search"
|
180
|
+
(match '(p (ul (li a (b c) (a (^ (href . "http://synthcode.com/")) "synthcode") d e f)))
|
181
|
+
(((and tag (or 'p 'ul 'li 'b)) *** ('a ('^ attrs ...) text ...))
|
182
|
+
(list tag attrs text))
|
183
|
+
(else #f))
|
184
|
+
'((p ul li) ((href . "http://synthcode.com/")) ("synthcode")))
|
185
|
+
|
186
|
+
(test-end)
|
data/test/nendo-util-test.nnd
CHANGED
@@ -40,13 +40,11 @@
|
|
40
40
|
(let1 var
|
41
41
|
(+ arg1 1) var))
|
42
42
|
expanded:
|
43
|
-
(define
|
44
|
-
(' dummy-function)
|
43
|
+
(define dummy-function
|
45
44
|
(lambda
|
46
|
-
(
|
47
|
-
|
48
|
-
|
49
|
-
(((' var)
|
45
|
+
(arg1)
|
46
|
+
(%let
|
47
|
+
((var
|
50
48
|
(+ arg1 1))) var)))
|
51
49
|
"
|
52
50
|
(disasm 'dummy-function 'info))
|
@@ -54,7 +52,7 @@
|
|
54
52
|
'(define (dummy-function arg1) (let1 var (+ arg1 1) var))
|
55
53
|
(disasm 'dummy-function 'source))
|
56
54
|
(test* "disasm expanded"
|
57
|
-
'(define
|
55
|
+
'(define dummy-function (lambda (arg1) (%let ((var (+ arg1 1))) var)))
|
58
56
|
(disasm 'dummy-function 'expanded))
|
59
57
|
(test* "disasm ruby-code"
|
60
58
|
"
|