Hatena::Groupcadr

do

do

動作

(do ((i 1 (1+ i)))
    ((< 5 i) (princ "End"))
  (princ i))
;-> 12345End

標準で含まれる処理系

登場時期

1969年(Maclisp)

Fortrandoループを模倣して導入された。

最初の形式は、

(do i 0 (1+ i) 
  (print i))

というもので、複数のループ変数を取り扱うことができなかった。

現在主流のCommon Lispと同じ書法は、1972年に導入されたとある。

さらに、1973年に第三の形式として、

(do <var-specs> nil
  body...)

のような形式が導入された、これはCommon Lispで書くならば、

(let <var-spec>
  body...)

のようなものを実現するために導入された。

意外にもletの登場は、これよりもずっと遅く、1979年頃Lispマシン上に登場した。

それまでは、代わりにlambdaや、progを使っていた様子で、このような経緯よりdoの3番目の書式が導入されたものと思われる。

なおCommon Lispで有効なのは、2番目の書法のみである。

慣用句

  • リストの各要素を処理
(do ((l '(foo bar baz) (cdr l))
     result)
    ((endp l) (nreverse res))
  (push (car l) result))
;=> '(foo bar baz)

各要素を処理し、戻り値用のリストにpushする。

順番が逆になるので、最終節でnreverseで逆転させる。

かなり古くからのdoの慣用句。

参考文献

  • The Evolution of Lisp (1993) Guy L. Steele, Jr., Richard P. Gabriel
  • LSPMAI;LISP NEWS
  • LSPMAI;LISP OARCHI
  • LSPMAI;LISP RECENT
  • 2007/11/29 17:02:38 do
  • 2007/12/02 02:08:59 TAO