なんか違う気がする

なんか全然違う気がするけど、遅延評価してみた。

正解では無い気がする。

(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読めって・・・