GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/dolist.html ・ emacs-doc.conao3.com

dolist マクロ

例えば、リストを反転させて、「first」「second」「third」が「third」「second」「first」になるようにしたいとします。

実際には、次のように reverse 関数を使用します。

(setq animals '(gazelle giraffe lion tiger))

(reverse animals)

whileループを使ってリストを逆順にするには、次のようにします。

(setq animals '(gazelle giraffe lion tiger))

(defun reverse-list-with-while (list)
  "Using while, reverse the order of LIST."
  (let (value)  ; make sure list starts empty
    (while list
      (setq value (cons (car list) value))
      (setq list (cdr list)))
    value))

(reverse-list-with-while animals)

dolist マクロの使い方は以下の通りです。

(setq animals '(gazelle giraffe lion tiger))

(defun reverse-list-with-dolist (list)
  "Using dolist, reverse the order of LIST."
  (let (value)  ; make sure list starts empty
    (dolist (element list value)
      (setq value (cons element value)))))

(reverse-list-with-dolist animals)

Infoでは、各式の閉じ括弧の後にカーソルを置き、C-x C-eと入力してください。いずれの場合も、次のように表示されるはずです。

(tiger lion giraffe gazelle)

エコー領域で。

この例では、既存の reverse 関数が最適であることは明らかです。while ループは、最初の例(while ループとリスト を参照)と同様です。while はまずリストに要素があるかを確認し、あればリストの最初の要素を既存のリスト(ループの初回反復では nil)に追加して新しいリストを構築します。2番目の要素が1番目の要素の前に、3番目の要素が2番目の要素の前にそれぞれ追加されるため、リストは逆順になります。

while ループを用いた式では、(setq list (cdr list)) 式によってリストが短縮されるため、最終的に while ループが停止します。さらに、ループが繰り返されるたびに新しくより短いリストを作成することで、cons 式に新たな先頭要素を提供します。

dolist 式は while 式とほぼ同様に動作しますが、dolist マクロは while 式を記述する際に必要となる処理の一部を担っています。

while ループと同様に、dolist もループします。異なる点は、ループするたびに自動的にリストを短縮すること—自らリストを CDR で辿っていく—そして、短縮された各バージョンのリストの CAR を、最初の引数に自動的にバインドすることです。

この例では、リストの各短縮版の CAR を記号 ‘element’ で参照し、リスト自体を ‘list’ 、返される値を ‘value’ と呼んでいます。dolist 式の残りの部分は本体となります。

dolist 式は、リストの各短縮版の CAR を element にバインドし、その後式の本体を評価して、ループを繰り返します。結果は value に返されます。