#:g1: latchの紹介

Posted 2014-12-22 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の357日目です。

latchとはなにか

 latchは、Felix Winkelmann氏作の評価を一度きりに限定する構文です。

パッケージ情報

パッケージ名latch
Chicken eggs:latch - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install latch

すれば、

(use latch)

で使えます。

試してみる

 Common Lispでいうdefvarみたいなものかなと思いましたが、letの構文になっていて、letの体裁ならば、元々多重に評価されることもなさそうなので謎です。
もしや束縛部の値側のフォームが同じなら使い回すのだろうかと思ってマクロを展開して眺めてみるも、そのようなところもなく…

(##core#let ((g542 (quote538 #(#%novalue)))
             (g543 (quote538 #(#%novalue)))
             (g544 (quote538 #(#%novalue))))
  (let537
    ((r0 (let537 ((tmp539 (##sys#slot g542 0)))
           (if541 (eq?540 (quote538 #%novalue) tmp539)
                  (let537 ((tmp539 (make-list 300 0)))
                    (##sys#setslot g542 0 tmp539)
                    tmp539)
                  tmp539)))
     (r1 (let537 ((tmp539 (##sys#slot g543 0)))
           (if541 (eq?540 (quote538 #%novalue) tmp539)
                  (let537 ((tmp539 (make-list 300 0)))
                    (##sys#setslot g543 0 tmp539)
                    tmp539)
                  tmp539)))
     (r2 (let537 ((tmp539 (##sys#slot g544 0)))
           (if541 (eq?540 (quote538 #%novalue) tmp539)
                  (let537 ((tmp539 (make-list 300 1)))
                    (##sys#setslot g544 0 tmp539)
                    tmp539)
                  tmp539))))
    (car r0)))

 とりあえず使い方としては下記の通りです。

(let*-once ((r (make-list 300 0)))
  (car r))
;=> 0

(let*-once ((r0 (make-list 300 0)) (r1 (cons 0 r0))) (car r0)) ;=> 0

まとめ

 今回は、latchを紹介してみました。
何か処理系固有の事情があったりするのでしょうか。

comments powered by Disqus