kiyoka.2009_06_29 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2009_06
5555555555455555555555555545555555555555555555555555555555555555555555555
5

[Nendo] ついにorとandを定義できた

5

私がRubyで書いているLisp方言、 Nendoの開発状況続き。

5

 

5

macroで構文をどんどん定義している。

5

ついに or と and が定義できた。ついでに let1 も。

5

先日定義したcondも使っている。すごい勢いで積み上がっていく感じが楽しいぞ。

5
 33-1210497807Redl
5
(define let1
5
  (macro (var expr body)
5
    (list 'let (list (list var expr)) body)))
4

 

5
(define or
5
  (macro lst
5
    (define (or_iter lst)
5
      (cond
5
       ((eq? 0 (length lst))
5
        false)
5
       ((eq? 1 (length lst))
5
        (let1 sym (gensym)
5
              (list 'let1 sym (car lst)
5
                    (list 'if sym sym false))))
5
       (else
5
        (let1 sym (gensym)
5
              (list 'let1 sym (car lst)
5
                    (list 'if sym sym (or_iter (cdr lst))))))))
5
    (or_iter lst)))
4

 

5
(define and
5
  (macro lst
5
    (define (and_iter lst)
5
      (cond
5
       ((eq? 0 (length lst))
5
        true)
5
       ((eq? 1 (length lst))
5
        (car lst))
5
       (else
5
        (list 'if (list 'not (list 'eq? 'false (car lst)))
5
              (and_iter (cdr lst))
5
              'false))))
5
    (and_iter lst)))
5

 

5

これが実行結果

5
bash-3.2$ ./nendo
5
nendo> (or)
5
false
5
nendo> (or 1 2 3)
5
1
5
nendo> (or false false 3)
5
3
5
nendo> (and)
5
true
5
nendo> (and true)
5
true
5
nendo> (and 1 2 3)
5
3
5
nendo> (and false 2) 
5
false
5
nendo> (and true  2)
5
2
5
nendo> (and 1 2 (print "3\n") (print "4\n") 5)
5
3
5
4
5
5
5
nendo> (and 1 2 false (print "3\n") (print "4\n") 5)
5
false
5

 

5

実は、gensym関数の実装はかなりサボっているのだ。

5

gensymで生成されるシンボルは若干ぶつかりにくいネーミングルールになっているだけ。いつかイタイ目に会うのかな。

5
nendo> (macroexpand '(or 1 2))
5
(let ((__gensym__10 1)) (if __gensym__10 __gensym__10 (let ((__gensym__11 2)) (if __gensym__11 __gensym__11 false))))
5

このへんがToy言語っぽい。何とかしたい...

5

 

5

...comment disabled...