Common Lisp の iterate の拡張計画メモ
概要
Python の itertools を Common Lisp の iterate に持っていこうとしてみたら、最初の方の chain
で足止め。どうしよう。
なぜ?
1)
- Python の itertools は、色々なコレクション型に適用できるイテレータがあることが前提。
- Common Lisp には、汎用のイテレータ構造はない。
- その代わりに iterate では、 iteration-driving clause の形で判断している。 (
in-vector
とか)
2)
- Python の itertools の
chain
は、複数のイテレータを連鎖させるもの。 - iterate 的に考えて、 iteration-driving clause を連鎖したいという気持ちになる。
- つまり、 iteration-driving clause のマクロ展開結果を得て、そこに何らかのコードを足すか、マクロ展開の結果実行されるコードをフックするかしたい。
- これは、 iterate のマニュアルに載っている拡張の方法だけではできない。
- iterate のコードをしっかり理解しないと無理っぽい。
3)
- さらに、 iterate のコードの冒頭のコメントに、 「TODO: concatenate という clause を足す」のようなことが書いてある。やりたいことは上記のものと同様。
- ここで TODO になっているということは、実装は一筋縄ではいかないんだろうな・・という予想をしている。
妥協案
汎用のイテレータ構造を実装??
- ダサい
一旦、「リストにだけ適用できます」バージョンを作る。
- とりあえず、こうしようかと画策中。
P.S.
Python の itertools は 「リッチなイテレータ構造」 + 「単機能のループ構文」
Common Lisp の iterate は 「単なるデータ構造」 + 「高機能なループ構文」
やっぱり、言語の拡張しやすい方に思想が向くものなのだろうか。