Emacs で named-let してみる

某所でみかけた named-let ってこんな感じ?
macro をうまく抑え込む方法はあるのだろうか。

下書きだと embed された外部リソースの確認ができんがな。hatena

追記:

あ、そうか。末尾再帰になってないときにだめなのか。
思いついたことそのまま書いてみたら穴だらけになるなぁ。

;; 末尾再帰版
(nlet factorial1 ((a 5)
                  (tmp 1))
  (cond
   ((= a 0)
    tmp)
   (t
    (factorial1 (1- a) (* tmp a)))))

;; だめだめ
(nlet factorial2 ((a 5))
  (cond
   ((= a 0)
    1)
   (t
    (* a (factorial2 (1- a))))))


むーこうなると前に公開されてたというのはこういうのも対処してあったのか気になる。
普通の再帰にするにも body を走査しないといけないからかなり面倒そう。
どうやるのだろう。