Hatena::Groupcadr

prog

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) 

標準で含まれる処理系

登場時期

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) 

上記の例は、最も古い慣用書式と思われ、古いコードでは、大体このように書かれている。

  1. 変数初期化
  2. ループ脱出判定
  3. 処理
  4. 変数の変更
  5. タグジャンプ

という流れになる。

変数初期化は、Common Lisp/ZetaLispでは、letのような形式で

(prog ((l '(foo bar baz)))
   ...)

と書くことが可能である。

また、このことからprog*が派生することとなった。

* はてなダイアリーキーワード:prog

  • 2007/11/29 17:02:38 do
  • 2007/11/29 17:02:47 prog