[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.8 繰り返し

Special Form: do ((variable init [step]) …) (test expr …) body …

[R5RS]

Special Form: let name bindings body …

[R5RS]

Macro: dotimes (variable limit [result]) body …
Macro: dolist (variable lexpr [result]) body …

Common Lispからの輸入です。それぞれ以下のように展開されます。

 
(dotimes (variable limit result) body …)
==>
(do ((tlimit limit)
     (variable 0 (+ variable 1)))
    ((>= variable tlimit) result)
  body …)

(dolist (variable lexpr result) body …)
==>
(begin
  (for-each (lambda (variable) body …) lexpr)
  (let ((variable '())) result))
Macro: while expr body …
Macro: while expr => var body …
Macro: while expr guard => var body …

Var は識別子でguardは一つの引数をとる手続きです。

最初の形式ではまずexprが評価され、もしそれが真値を返したら body … が評価されます。そしてexprが真値を返す 限り繰り返されます。

2番目の形式では、body … で有効な変数varを 作成し、exprの結果に束縛します。

最後の形式では、expr の返り値が guard に渡されこの 結果が真値である限り body … が繰り返されます。 変数 varexpr の結果に束縛されます。

while 自体の返り値は不定です。

 
(let ((a '(0 1 2 3 4)))
  (while (pair? a)
    (write (pop! a)))) ⇒ prints "01234"

(let ((a '(0 1 2 3 #f 5 6)))
  (while (pop! a) integer? => var
    (write var))) ⇒ prints "0123"
Macro: until expr body …
Macro: until expr guard => var body …

while の条件を逆にしたものです。 つまり、 最初の形式ではexprが真値を返すまで body … を 繰り返します。2番目の形式ではexprの結果がguard に渡され それが真値を返すまで繰り返します。 Varexpr返り値に 束縛されます。

(guard を省いた2番目の形式ではvarは常に#fへ 束縛されるため、あまり意味がありません。)

until自体の返り値は不定です。

 
(let ((a '(0 1 2 3 4)))
  (until (null? a)
    (write (pop! a)))) ⇒ prints "01234"

(until (read-char) eof-object? => ch
  (write-char ch))
 ⇒ reads from stdin and writes char until EOF is read

[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on May 28, 2012 using texi2html 1.82.