#:g1: clazyの紹介

Posted 2014-07-05 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の187日目です。

clazyとはなにか

 clazyは、Marco Antoniotti氏作のCommon Lispの遅延評価系のライブラリです。

パッケージ情報

パッケージ名clazy
Quicklisp
Quickdocsclazy | Quickdocs
common-lisp.netCLAZY: Lazy Calling in Common Lisp
CL Test Grid: ビルド状況clazy | CL Test Grid

インストール方法

(ql:quickload :clazy)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 遅延評価でお馴染のコンスのストリームを始めとして、定番のところは大体揃っています。

(defun from (n)
  (clazy:delay (cons n (from (+ n 1)))))

(let ((s (from 1))) (dotimes (i 100 (first (clazy:force s))) (setq s (cdr (clazy:force s))))) ;=> 101

(let ((s (labels ((lp (n m) (clazy:cons-stream m (lp (+ n m) n)))) (lp 1 0)))) (dotimes (i 100 (clazy:head s)) (setq s (clazy:tail s)))) ;=> 354224848179261915075

 データ構造だけでなく、引数が遅延評価される関数を定義する、deflazyというものも用意されています。

(clazy:deflazy myif (pred then &optional else)
  (if pred then else))

(clazy:call #'myif nil (loop) 'hello) ;=> HELLO

しかし、呼び出しで、callというのを使わければいけない様子。色々難しいところです。

 ちなみに、パッケージにニックネームが沢山付いているのですが、長い名前はともかく短い名前を複数付けたりするのは競合しそうだなあと思ったりです。

(package-nicknames (find-package "CLAZY"))
;=>  ("CLAZY" "CL.EXT.DACF.LAZY" "CL.EXTENSIONS.DATA-AND-CONTROL-FLOW.LAZY" "LAZY")

まとめ

 今回は、clazyを紹介してみました。Clojure等では、遅延シークエンスも含めてコレクションとして纏められていますが統一感があって良いですよね。

comments powered by Disqus