Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-01-28

LOOPマクロと内包表記とINTERLISP

| 20:05 | LOOPマクロと内包表記とINTERLISP - わだばLisperになる を含むブックマーク はてなブックマーク - LOOPマクロと内包表記とINTERLISP - わだばLisperになる

言語内に組み込まれたミニ言語の代表格として語られることが多い、LOOPマクロ

Common Lispの特長を良く表わしているとも言われますが、このLOOPマクロが初めて導入されたのは、Common Lispより以前のMACLISP系の処理系で、Lisp Machine Lisp、MACLISP、NIL等の共通の繰り返し機構として使われていたようです。*1

そんなLOOPマクロですが、CLtLでは、最初にloopという無限ループの枠組だけ提供して、後にフルセットで提供されることになったようです。

CLより前に後にフルセットのLOOPマクロはあったので、最初からフルセットで導入すれば良いようなものですが、導入された後も好き嫌いで色々言われる位なので、当時も色々あったのでしょう。

それで、そのオリジナルのLOOPマクロですが、MACLISP起源ではなく、INTERLISPの繰り返し機構の"FOR"とのこと。*2

構文は大体、Common LispのLOOPと同じ感覚で、

INTERLISP-10  31-Dec-84 ...
Hi.
3_(for i from 0 to 100 collect i)

(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100)
4_

のように機能します。

LOOPというキーワードが無いだけで割とそのまんまです。

そんなINTERLISPのFORなのですが、

(for i from 0 to 100 collect i)

だけでなく、

(collect i for i from 0 to 100)

(do (print (cons i (times 2 i))) for i from 0 to 10)
;=>
;(0 . 0)
;(1 . 2)
;(2 . 4)
;(3 . 6)
;(4 . 8)
;(5 . 10)
;(6 . 12)
;(7 . 14)
;(8 . 16)
;(9 . 18)
;(10 . 20)
;NIL
;

のようにキーワードをひっくり返して書いても良かったりします。

自分的には、CLのLOOPよりこっちの方が読み易くて好きだったりするのですが、このひっくり返した構文って最近流行りの内包表記っぽいですよね。

それで、その内包表記のCL版なのですが、やっぱり便利なので最近になって色々実装してみたりしている人が沢山いるようです。

等々

大体のものは、1991年に発表されたGuy Lapalme氏のImplementation of a “Lisp comprehension” macroという論文を参考にしていてCLのLOOPをマクロで包んだものが多いようです。

それで形としては、結局INTERLISPのFORループみたいなものができてしまっていて30年ぐるっと回って元に戻って来ちゃったという感が強く、感慨深いものがあります(笑)

おまけ

Common Lisp対Schemeで比較されてあれこれ言われる今日ですが、色々違いこそあれMITのMACLISP系の流れのもので所詮似た者同士に思えます。

XEROX系のINTERLISPは、ほぼ絶滅してしまいましたが、これらのMIT系とは大分違い、現在のLISP観からするとかなり逸脱したものになっているので、変ったものが好きな方には是非お勧めしたいです。*3

*1:Chinual 3rd ed. 1981

*2:ちなみに、INTERLISPのFORのMACLISPへの移植は1976年にされていたようです。

*3:例えば、LOOPマクロの英文として読み下せるような文法というのは、INTERLISPの一つの特長のように思えます。