loop で フィボナッチ数。あるいは and

次のようにしてうまくいかなかった。

(defun fib (n)
  (loop for a = 0 then b
     for b = 1 then (+ a b)
     repeat n
     finally (return a)))

b に (+ a b) をいれる時点で a は b になっていたから。
CLiki: Fibonacci を見ると、同じようなコードが載っていて、どうしてちゃんと動くんだ、とよく見てみたら、b の前の for が and になっていた。

(defun fib (n)
  (loop for a = 0 then b
     and b = 1 then (+ a b)
     repeat n
     finally (return a)))

これで a と b の更新が パラレル に行われる。
ちゃんと http://www.lisp.org/HyperSpec/Body/sec_6-1-2-2.html に書いてあった。

パラレルといえば、psetq, let, do なんかも同様。逆にシーケンシャルなのは setq, let*, do*.
Common Lisp は本当細かいところまでよく考えてあると思う。