(prog (l) (setq l '(foo bar baz)) L (cond ((null l) (return))) (print l) (setq l (cdr l)) (go L)) ;=> ;(FOO BAR BAZ) ;(BAR BAZ) ;(BAZ)
順次実行、ループの処理の為に導入されたものとしては最も古く、現在の感覚からは意外であるが、Common Lispより古いLispでは、progの利用はかなり一般的だった様子である。
Common Lispでは、progがより一般化され、tagbody、block、letと各要素が別々に提供されることになった。
上記のコードは、Common Lispでは、
(block nil (let (l) (tagbody (setq l '(foo bar baz)) L (cond ((null l) (return))) (print l) (setq l (cdr l)) (go L))))
と書くことができる。
この分割が現在ではprogを利用したコードが殆ど無くなったことの一因であるとCLtLには記載されている。
(prog (l) (setq l '(foo bar baz)) L (cond ((null l) (return))) (print l) (setq l (cdr l)) (go L)) ;=> ;(FOO BAR BAZ) ;(BAR BAZ) ;(BAZ)
上記の例は、最も古い慣用書式と思われ、古いコードでは、大体このように書かれている。
という流れになる。
変数の初期化は、Common Lisp/ZetaLispでは、letのような形式で
(prog ((l '(foo bar baz))) ...)
と書くことが可能である。
また、このことからprog*が派生することとなった。
* はてなダイアリーキーワード:prog