はじめに
この連載ではCommon LispのLOOPマクロをサンプルを使って紹介する。
LOOPマクロは (clライブラリをロードすることで) Emacs Lispでも利用可能である。
【Common Lisp: loopマクロ用法抄より引用】
Grahamの ANSI Common Lisp では嫌われていて碌に説明のないloopマクロ。一方、 実践Common Lisp では対照的に好んで用いられていて、全編に渡って頻繁に使われている。しかしloopマクロは難しいという意識があるのかその説明は第22章とかなり後回しにされており、ちぐはぐな感を受ける。ここでは、 黒帯のためのLOOP という題のつけられたその章で解説されているloopマクロの用法を整理してみた。
ANSI Common Lisp での黒魔術扱いに敬遠していたloopマクロだったが、こうして整理してみるとそれほど難しく考えずとも便利に使うことができそうだ。
実践Common Lisp
作者: Peter Seibel,佐野匡俊,水丸淳,園城雅之,金子祐介
出版社/メーカー: オーム社
発売日: 2008/07/26
メディア: 単行本(ソフトカバー)
今回は…
今回は、LOOP マクロに関する Emacs Lisp と Common Lisp の非互換性について紹介します。
ベクターのリードシンタックスの違い
- 厳密には、LOOPマクロ自体の違いではないですが…
CLISP> (loop for i across #(1 2 3) do (print i))
1
2
3
⇒NIL
ELISP> (require 'cl)
ELISP> (loop for i across [1 2 3] do (print i))
1
2
3
⇒nil
値の累積(accumulation)に関する違い
- Emacs Lisp では、以下のように concat (文字列の結合) accumulation が使えます。
ELISP> (require 'cl)
ELISP> (loop for str in '("A" "B" "C")
for sep = "" then ","
concat sep
concat str)
⇒"A,B,C"
最後に
他にも非互換等ありましたらコメントか https://twitter.com/akmiyoshi までお願いします。