Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-08-06

CLで学ぶ「プログラミングGauche」 (9.5)

| 18:27 | CLで学ぶ「プログラミングGauche」 (9.5) - わだばLisperになる を含むブックマーク はてなブックマーク - CLで学ぶ「プログラミングGauche」 (9.5) - わだばLisperになる

9.5 名前つきlet

Schemeには名前つきletがありますが、CLのletにはそういった拡張はありません。

近いところでは、局所関数のlabels位になるかと思います。

また、処理系によっては、named-let等の名前で隠し持っていることもあるようです。

調べた限りでは、SBCLだと、named-let、cmuclだとiterateというのを見付けられました。

どちらも、labelsに展開されるマクロですが…。

使用上の注意点としては、Schemeと違って末尾再帰の最適化をしてくれるとは限らないので、ループと全く同じ感覚で使うためには、それなりに処理系に応じて下調べが必要だと思われます。

(defun fact (n)
  (labels ((*fact (n acc)
             (if (zerop n)
                 acc
                 (*fact (1- n) (* acc n)))))
    (*fact n 1)))

;; SBCL
(import 'sb-impl::named-let)

(defun fact-2 (n)
  (named-let *fact ((n n) (acc 1))
    (if (zerop n)
        acc
        (*fact (1- n) (* acc n)))))

;cmuclだとiterateという名前で存在。