遅延評価実験

まず、こういうクラスを定義いたしまして

(define-class <hoge> ()
  ((slota :init-keyword :a :getter get-a)
   (slotb :init-keyword :b :getter get-b)
   ))

次のようにREPLで実行してみる。

gosh> (define hoge (make <hoge> :a '(1 2 3) :b (get-a hoge)))
*** ERROR: unbound variable: hoge
Stack Trace:
_______________________________________
  0  (get-a hoge)
        At line 2 of "(stdin)"
  1  (make <hoge> :a '(1 2 3) :b (get-a hoge))
        At line 2 of "(stdin)"
gosh> (define fuga (make <hoge> :a '(1 2 3) :b (lazy (get-a fuga))))
fuga
gosh> (d fuga)
#<<hoge> 0x823e928> is an instance of class <hoge>
slots:
  slota     : (1 2 3)
  slotb     : #<promise 0x823aa00>
gosh> (force (get-b fuga))
(1 2 3)

遅延評価を使うと、インスタンスを作成するときのスロットの値に、今まさに作成しようとしているインスタンスを使った値を指定できる、という実験でした。これができると、Packrat Parsingの論文のサンプルコードがすんなりSchemeに書き直せる。最初にHaskellのコード見たときは、Haskell以外でどうやってこれ書くんだよ!と思ったけどSchemeでも書けるじゃん。

Packrat Parsingの論文のサンプルコードを、Schemeでおきかえながら理解しているんだけど、以外なほどにロジックをそのまま書き移せるからびっくりしている。Gaucheのライブラリの充実っぷりに感服。パターンマッチ初めてまともに使ってみたけど、便利すぐる。