Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

と言われて怒られます。