prog
形式
(prog (変数) 式もしくは、タグ)動作
(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)
標準で含まれる処理系
- Lisp 1.5
- Maclisp
- Zetalisp
- Common Lisp
- Interlisp
- TAO
登場時期
1959年(Lisp 1.5)順次実行、ループの処理の為に導入されたものとしては最も古く、現在の感覚からは意外であるが、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には記載されている。
慣用句
- リストをCDRダウン
(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*が派生することとなった。
2007年12月02日(日) 17:28:40 Modified by g000001