/estrategy

to lean eval-strategy on scheme

Primary LanguageScheme

estrategy

scheme 超循環評価器

chicken-installしてください。

csi> (use estrategy)
csi> (driver-loop)
scheme[value]> 

引数の評価順序は左から右。
lambda式のパラメータにオプションをつけることで
そのパラメータの評価戦略を値呼び、名前呼び、必要呼びの3つから選べるようにする。
オプション無しだとデフォルトの評価戦略で評価されるようになる。

(lambda ((x value) (y name) (z need))
  (+ x y z))

call-byによってデフォルトの評価戦略を変更できる。

scheme[value]> (call-by need)
scheme[need]> (let ((foo (lambda (x y)
                           (+ (* x 2) x))))
                (let ((goo (lambda (x)
                             (goo x))))
                  (let ((hoo (lambda (x)
                               (display "hoo ")
                               (display x)
                               (display "\n")
                               x)))
                    (foo 20 (goo 10))
                    (foo (hoo 10) (20)))))
hoo 10
30
scheme[need]> (call-by name)
scheme[name]> (let ((foo (lambda (x y)
                           (+ (* x 2) x))))
                (let ((goo (lambda (x)
                             (goo x))))
                  (let ((hoo (lambda (x)
                               (display "hoo ")
                               (display x)
                               (display "\n")
                               x)))
                    (foo 20 (goo 10))
                    (foo (hoo 10) (20)))))
hoo 10
hoo 10
30
scheme[name]> (call-by value)
scheme[value]> (let ((foo (lambda (x y)
                           (+ (* x 2) x))))
                (let ((goo (lambda (x)
                             (goo x))))
                  (let ((hoo (lambda (x)
                               (display "hoo ")
                               (display x)
                               (display "\n")
                               x)))
                    (foo 20 (goo 10))
                    (foo (hoo 10) (20)))))
Error: Unbound variable
goo 
scheme[value]>