npt-japanese

% Macro DOTIMES

UP


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 - もしreturnreturn-fromが実行されたときは、 そのフォームから渡された返却値であり、 それ以外の場合はresult-formによる返却値です。

定義

dotimesは、一連の整数による繰り返しを行います。

dotimescount-formを評価し その返却値は整数でなければなりません。 もしcount-formがゼロか負の場合は、ボディ部は実行されません。 それからdotimesはボディ部をいちど実行するごとに、 各整数値を0からcount-formを含まない値まで上げて行き、 tagstatementを順番に実行し、 その際にvarを各整数に束縛します。 そしてresult-formを評価します。 result-formが処理された時点で、 varにはボディ部が実行された回数が束縛されています。 tagstatementにラベル付けされます。

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

副作用

なし。

影響

なし。

例外

なし。

参考

do, dolist, tagbody

備考

goは、dotimesのボディ部で tagによってラベル付けされた文へ 遷移を制御するために使用されます。


TOP, Github