% Macro DOTIMES
Macro DOTIMES
dotimes
(var count-form [result-form]) declaration*
{
tag |
statement}
*
=> result*
var - シンボル
count-form - フォーム
result-form - フォーム
declaration - 宣言式。評価されません。
tag - go
のタグ。評価されません。
statement - compound-form。下記の説明に従って評価されます。
result - もしreturn
かreturn-from
が実行されたときは、
そのフォームから渡された返却値であり、
それ以外の場合はresult-formによる返却値です。
dotimes
は、一連の整数による繰り返しを行います。
dotimes
はcount-formを評価し
その返却値は整数でなければなりません。
もしcount-formがゼロか負の場合は、ボディ部は実行されません。
それからdotimes
はボディ部をいちど実行するごとに、
各整数値を0からcount-formを含まない値まで上げて行き、
tagとstatementを順番に実行し、
その際にvarを各整数に束縛します。
そしてresult-formを評価します。
result-formが処理された時点で、
varにはボディ部が実行された回数が束縛されています。
tagはstatementにラベル付けされます。
nil
という名前の暗黙のblock
が、
dotimes
のフォーム全体を囲みます。
return
文は、それ以上の繰り返しを行うことなく
ループを即座に終了させるときに使われ、
そのときの返却値は0や複数の値を指定できます。
繰り返しのボディ部は暗黙のtagbody
であり、
これはgo
文の遷移先としてのタグを含みます。
宣言は繰り返しのボディ部の前に配置できます。
varの束縛のスコープは、count-formを含みませんが result-formは含まれます。
dotimes
が各繰り返しごとにvarの
新しい束縛を確立するかどうか、
あるいはvarが一度束縛されてからその後の繰り返しで
代入されるのかどうかは
実装依存です。
(dotimes (temp-one 10 temp-one)) => 10
(setq temp-two 0) => 0
(dotimes (temp-one 10 t) (incf temp-two)) => T
temp-two => 10
次に文字列を処理するdotimes
の使用例を示します
;;; もし指定された文字列のサブシーケンスが回文ならTrue。
;;; (つまり前から読んでも後ろから読んでも同じとき)
(defun palindromep (string &optional
(start 0)
(end (length string)))
(dotimes (k (floor (- end start) 2) t)
(unless (char-equal (char string (+ start k))
(char string (- end k 1)))
(return nil))))
(palindromep "Able was I ere I saw Elba") => T
(palindromep "A man, a plan, a canal--Panama!") => NIL
(remove-if-not #'alpha-char-p ;Remove punctuation.
"A man, a plan, a canal--Panama!")
=> "AmanaplanacanalPanama"
(palindromep
(remove-if-not #'alpha-char-p
"A man, a plan, a canal--Panama!")) => T
(palindromep
(remove-if-not
#'alpha-char-p
"Unremarkable was I ere I saw Elba Kramer, nu?")) => T
(palindromep
(remove-if-not
#'alpha-char-p
"A man, a plan, a cat, a ham, a yak,
a yam, a hat, a canal--Panama!")) => T
なし。
なし。
なし。
go
は、dotimes
のボディ部で
tagによってラベル付けされた文へ
遷移を制御するために使用されます。