いいかげんなLisp処理系ぽいの(3)
内部で引数の処理がとてつもなくいいかげんだったのを、かなりいいかげんくらいにした。あとlambdaできるようにしてみた。たぶん。ああ、でも可変長引数はできるようにしてない。(lambda x ...), (lambda (x y . z) ...) みたいの。
> (define fact (lambda (x) (if (zero? x) 1 (* x (fact (- x 1)))))) #closure > (fact 5) 120 > ((lambda (f x) (f f x)) (lambda (f x) (if (zero? x) 1 (* x (f f (- x 1))))) 5) 120 > ((lambda (f x) (f f x)) (lambda (f x) (if (zero? x) 1 (* x (f f (- x 1))))) (+ 1 2 3)) 720
おー。自分で書いておーも何も無いけど。「=」は内部でどういう名前にする名前にするか思いつかんかったのでとりあえずzero?とか追加してlambdaのテスト。今考えるとeqdigitpとかその辺で良かったかな。pってなんの略だっけ。predicateか。
いやあ、趣味グラムはプログラムの内部構成とか好き勝手できまくって楽しいなあ。あと俺Dを本当にbetter Cとしてしか使ってねなと思った。まあそんな人のための言語でもあるよなー。いいかげんにだけど実装してみて感じたが、lambdaは素敵だ。
ソースコード http://konbu.s13.xrea.com/lib/scm/istsp.d
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/lambda.html 参考にラムダ計算。
> (define _cons (lambda (x y) (lambda (z) (z x y)))) #closure > (define _car (lambda (z) (z (lambda (x y) x)))) #closure > (define _cdr (lambda (z) (z (lambda (x y) y)))) #closure > (_car (_cons 1 2)) 1 > (_cdr (_cons 1 2)) 2
ラムダおもしれー。