Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

prog1やprog2はprognの親戚。ただし挙動が一寸違う。

prognの親戚、prog1やprog2やは数値のS式の結果をゲットできます。
たとえばこんな感じ。

(prog2
  (setq i 12) 
  (setq j 34)
  (format "%5d" (+ i j)))
34

これだと何の役に立つかサッパリですが

(setq i '(1 2 3))
(prog1
    (car i)
    (setq i (cdr i)))

でprog1を繰り返し呼び出すと

1 => 2 => 3 => nil

となります。ぱっと見、破壊的carですねこれは。
ここから

  • とりあえず、全ての式は評価している
  • その上で、一番目のS式の結果しか返さない

という挙動を読み取る事ができます。
試しに

(setq i 1)
(prog1
    (setq i (+ i 1))
    (setq i (+ i 2)))

でprog1を連続実行すると

2 => 5 => 8 => 11 => 14 =>...

という結果を得ます。

おまけ:prog3はない

prog3とやると

eval: Symbol's function definition is void: prog3

と言われて怒られます。