% Macro DOLIST
Macro DOLIST
dolist
(var list-form [result-form]) declaration*
{
tag |
statement}
*
=> result*
var - シンボル
list-form - フォーム
result-form - フォーム
declaration - 宣言式。評価されません。
tag - go
のタグ。評価されません。
statement - compound-form。下記の説明に従って評価されます。
result - もしreturn
かreturn-from
が実行されたときは、
そのフォームから渡された返却値であり、
それ以外の場合はresult-formによる返却値です。
dolist
は、リストの要素に対して繰り返しを行います。
dolist
のボディ部はtagbody
Ni似ています。
それはtagとstatementが続くものが含まれます。
dolist
はlist-formを評価し、
それはリストでなければいけません。
そのあとボディ部がリストの各要素ごとに一度だけ実行され、
実行はtagとstatementを順番に行われ、
その際にvarを各要素に束縛します。
そしてresult-formを評価します。
tagはstatementにラベル付けされます。
result-formが実行された時点で、
varにはnil
が束縛されています。
nil
という名前の暗黙のblock
が、
dolist
のフォーム全体を囲みます。
return
文は、それ以上の繰り返しを行うことなく
ループを即座に終了させるときに使われ、
そのときの返却値は0や複数の値を指定できます。
varの束縛のスコープは、list-formを含みませんが result-formは含まれます。
dolist
が各繰り返しごとにvarの
新しい束縛を確立するかどうか、
あるいはvarが一度束縛されてからその後の繰り返しで
代入されるのかどうかは
実装依存です。
(setq temp-two '()) => NIL
(dolist (temp-one '(1 2 3 4) temp-two) (push temp-one temp-two)) => (4 3 2 1)
(setq temp-two 0) => 0
(dolist (temp-one '(1 2 3 4)) (incf temp-two)) => NIL
temp-two => 4
(dolist (x '(a b c d)) (prin1 x) (princ " "))
>> A B C D
=> NIL
なし。
なし。
なし。
do
,
dotimes
,
tagbody
,
3.6. 横断の規則と副作用
go
は、dotimes
のボディ部で
tagによってラベル付けされた文へ
遷移を制御するために使用されます。