uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

遅延評価やってみた

OKIソフトウェアさんの「Groovy 応用: 遅延評価によるフィボナッチ数の計算」という記事があり、大変興味深いのです。もうちょっとシンプルにできるか&リスト処理をGroovyで少しきれいにかく方法はないか、と思ってやってみました。

  • 「クロージャが遅延評価されるリスト」というクラスを作る。このリスト中のクロージャは遅延評価される。
  • nthの代わりにgetAt
  • first,tailをプロパティ化し強制評価に使用。
  • リストリテラルからの変換はas演算子でできるようにasTypeメソッドをEMCに突っ込む


という感じ。ここまでくると、今にもdefunとかevalとかapplyとかcondとか付け足して「Lisp DSLだ」とか言いたくなる訳ですが、それはリストでやるよりビルダーで表記すべきか。出かけますのでまた別の機会に考えるとしよう。

本題の遅延評価については、別に特殊なことではなくて、値をあらかじめ計算しておくのではなくて、後で実際に必要になったときに値を計算するある種のプレースホルダを値の代わりに置いておくという話です。この「後で計算するためのプレースホルダ」にクロージャが大変向いている。SoftReferenceつかえばキャッシュ機構とかにも役立つんですよねきっと。

ちなみに最初はLazy Transformationでやろうと思ったんですが、フィールド初期化に難ありで断念。意味的にはLazyフィールドはコンストラクタで初期化できるべきだと思うが、現在はそうなってはいません。