#:g1: hu.dwim.reiterateの紹介

Posted 2014-07-25 12:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の206日目です。

hu.dwim.reiterateとはなにか

 hu.dwim.reiterateは、dwim.huの人達によるiterateの再実装のようです。

パッケージ情報

パッケージ名hu.dwim.reiterate
Quicklisp
Quickdocshu.dwim.reiterate | Quickdocs
CL Test Grid: ビルド状況hu.dwim.reiterate | CL Test Grid

インストール方法

(ql:quickload :hu.dwim.reiterate)

試してみる

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

 iterateに何か不満があっての再実装なんだと思いますが、ドキュメントも無いので何が不満だったのかは外から眺める限りは謎です。テストケースがあるのでiterateに慣れた人なら何を解決しようとしていたかが分かるのかもしれません。

 とりあえずロード方法についての注意ですが、duim.huのプロダクトはduim.huで良く使われているリードテーブルで読まないと何かが上手くロードできないことがあります。
hu.dwim.reiterateに関しては、標準のリードテーブルで読めば、loggerがないよと怒られますが、リーダーマクロが定義されていないのが原因です。とりあえず、

(let ((*readtable* (or (named-readtables:find-readtable :hu.dwim)
                       (named-readtables:make-readtable :hu.dwim :merge '(:standard)))))
  (ql:quickload :hu.dwim.syntax-sugar)
  (asdf/utility:call-function :hu.dwim.syntax-sugar :set-feature-cond-syntax-in-readtable)
  (asdf/utility:call-function :hu.dwim.syntax-sugar :set-sharp-boolean-syntax-in-readtable)
  (ql:quickload :hu.dwim.reiterate))

こんな感じにロードしてやる必要があります。

 さて、hu.dwim.reiterateとiterateの比較ですが、基本的に同じですが、微妙に違っています、開発途中のようなので作りかけなのか仕様なのかは不明です。

(defpackage :maliikto
  (:use :cl :hu.dwim.reiterate))

(cl:in-package :maliikto)

(iter (:for i :from 0 :to 9) (collecting i)) ;=> (0 1 2 3 4 5 6 7 8 9)

こういうシンプルなものは全く同じですが、toを省略したfor節がどうも上手く動きません。
それと、:fromはキーワードでないと上手く動かなかったり、collectは、collectingと書かないといけません。

(iter:iter (iter:for x :from 0)
           (iter:repeat 10)
           (iter:collecting x))
;=>  (0 1 2 3 4 5 6 7 8 9)

(iter (for x :from 0) (repeat 10) (collecting x)) ;!> The variable X is unbound.

(iter:iter (iter:for x downfrom 0) (iter:for e :in-vector "いろはにほへとちりぬるを") (iter:collect (list x (string e)))) ;=> ((0 "い") (-1 "ろ") (-2 "は") (-3 "に") (-4 "ほ") (-5 "へ") (-6 "と") (-7 "ち") (-8 "り") (-9 "ぬ") (-10 "る") (-11 "を"))

(iter (for x :from 0 :downto most-negative-fixnum) (for e :in-vector "いろはにほへとちりぬるを") (collecting (list x (string e)))) ;=> ((0 "い") (-1 "ろ") (-2 "は") (-3 "に") (-4 "ほ") (-5 "へ") (-6 "と") (-7 "ち") (-8 "り") (-9 "ぬ") (-10 "る") (-11 "を"))

ちなみに、:hu.duim.loggerを読み込んだ状態で実行すると、

(iter (:for i :from 0 :to 9)
      (collecting i))
;=>  (0 1 2 3 4 5 6 7 8 9)
;>> 20:42 3              LOG DEBUG   Registering as body of #<LOOP-FORM NIL {1047901A63}> ((:FOR CL-USER::I :FROM 0 :TO 9) (HU.DWIM.REITERATE:COLLECTING CL-USER::I))
;>> 20:42 3              LOG DEBUG   Registering as body of #<LOOP-FORM NIL {1047901A63}> (:FOR CL-USER::I :FROM 0 :TO 9)
;>> 20:42 3              LOG DEBUG   Registering as body of #<LOOP-FORM NIL {1047901A63}> (HU.DWIM.REITERATE:COLLECTING CL-USER::I)
;>> 20:42 3              LOG DEBUG   Processing toplevel iterate form #<HU.DWIM.REITERATE::LOOP-FORM NIL {1047901A63}>; stack is (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   Walking body form (:FOR CL-USER::I :FROM 0 :TO 9); stack is (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   Form (:FOR CL-USER::I :FROM 0 :TO 9) matched as a clause in stack (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   LOOP-STACK-POSITION will search stack (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   BELONGS-TO-A-PARENT-ITERATE-FORM? (:FOR CL-USER::I :FROM 0 :TO 9) #<LOOP-FORM NIL {1047901A63}> loop-form T
;>> 20:42 3              LOG DEBUG   Will try to process clause (:FOR CL-USER::I :FROM 0 :TO 9) in loop called 0
;>> 20:42 3              LOG DEBUG   Hijacked clause stack is (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   Will walk 0 in context #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Will walk 9 in context #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Augmented environment with variable CL-USER::I in the context of #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Augmented environment with variable #:FOR/LIMIT/2344 in the context of #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Expanded (:FOR CL-USER::I :FROM 0 :TO 9) into ((WHEN # #))
;>> 20:42 3              LOG DEBUG   Finished walking body form (:FOR CL-USER::I :FROM 0 :TO 9), will unwalk now
;>> 20:42 3              LOG DEBUG   Walking body form (HU.DWIM.REITERATE:COLLECTING CL-USER::I); stack is (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   Form (HU.DWIM.REITERATE:COLLECTING CL-USER::I) matched as a clause in stack (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   LOOP-STACK-POSITION will search stack (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   BELONGS-TO-A-PARENT-ITERATE-FORM? (HU.DWIM.REITERATE:COLLECTING CL-USER::I) #<LOOP-FORM NIL {1047901A63}> loop-form T
;>> 20:42 3              LOG DEBUG   Will try to process clause (HU.DWIM.REITERATE:COLLECTING CL-USER::I) in loop called 0
;>> 20:42 3              LOG DEBUG   Hijacked clause stack is (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   Will walk CL-USER::I in context #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Registering new clause data with key (HU.DWIM.REITERATE:COLLECTING NIL) in loop #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Augmented environment with variable #:COLLECTING/HEAD/2345 in the context of #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Augmented environment with variable #:COLLECTING/LAST-CONS/2346 in the context of #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Registering result-form-candidate with key (HU.DWIM.REITERATE:COLLECTING NIL), form #:COLLECTING/HEAD/2345, stack is (#<LOOP-FORM NIL {1047901A63}>)
;>> 20:42 3              LOG DEBUG   Expanded (HU.DWIM.REITERATE:COLLECTING CL-USER::I) into ((LET #
;>>                                                                                             #))
;>> 20:42 3              LOG DEBUG   Finished walking body form (HU.DWIM.REITERATE:COLLECTING CL-USER::I), will unwalk now
;>> 20:42 3              LOG DEBUG   Finished walking body of #<LOOP-FORM NIL {1047901A63}>
;>> 20:42 3              LOG DEBUG   Building result form for #<LOOP-FORM NIL {1047901A63}>

マクロ展開時にこんな感じでログが出ます。

まとめ

 今回は、hu.dwim.reiterateを紹介してみました。
やはり、何故自前で実装しているのかが知りたいところです。

comments powered by Disqus