6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

黒帯のためのLOOP(2)

Last updated at Posted at 2014-06-21

はじめに

この連載では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の場合
CLISP> (loop for i across #(1 2 3) do (print i))

1
2
3
NIL
ELISPの場合
ELISP> (require 'cl)
ELISP> (loop for i across [1 2 3] do (print i))
1
2
3
nil

値の累積(accumulation)に関する違い

  • Emacs Lisp では、以下のように concat (文字列の結合) accumulation が使えます。
ELISPのみ
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 までお願いします。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?