なんか違う気がする
なんか全然違う気がするけど、遅延評価してみた。
正解では無い気がする。
(define (forever) (forever)) (define (true x y) (lambda () (x))) (define (false x y) (lambda () (y))) (define (if b x y) (lambda () (((b) (lambda () (x)) (lambda () (y)))))) ((lambda () ((if (lambda () true) (lambda () ((if (lambda () false) (lambda () (forever)) (lambda () 1)))) (lambda () 2))))) ; 1
ちょっとやりすぎ感はあるけど、ルールはこう。
- 引数という引数には全て、lambdaを付ける。
- 評価するときは一旦リアルな世界へ。lambdaを剥して、値を評価し、もう一度lambdaを付けて返す。またλな世界へ。
昨日のZから思いついた。if内の(forever)は正しく評価されるし、ネストした場合でも正しく評価出来る。
なんか違う気がする。
ついでに無限なリスト。
(define (never-end-list x) (cons x (lambda () (never-end-list (+ x 1))))) (car ((cdr ((cdr (never-end-list 1)))))) ; 3
((cdr...が微妙だけど、無限が表現出来た。
なんか違う気がする。
SICP読めって・・・