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 | 
             
                   "
         |