20

フォーム(ここではClojure)で、let次のようなことができます

(let [[u s v] (svd A)] 
   (do-something-with u v))

wheresvdは長さ 3 のリストを返します。これは非常に自然なことです。

(def [u s v] (svd A))

フォームのデフォルトの動作としてのさまざまな一般化def? defこれがすでに行っていることとどのように干渉するかわかりません。Zen of Lisp や Clojure を理解している人は、なぜdefが ほど強力なバインディング (破壊による) をサポートしないのか説明できますかlet?

4

4 に答える 4

19

defは、コンパイラ レベルでの特別な形式です。Var を作成します。def破壊が利用可能になる前に、利用可能で使用可能でなければなりません。構造化をサポートしないコンパイラ プリミティブである にも似たようなものがlet*あります。その後clojure/core.clj、言語の数千行が最終的に十分に強力になり、構造化を使用した のバージョンを のlet上にマクロとして提供できるようになりますlet*

必要に応じて、これを行うマクロ (たとえば、def+) を作成できます。個人的にはちょっと気持ち悪くて使わないと思いますが、Lisp を使うということは自分に合った言語を使えるようになるということです。

于 2011-11-19T23:37:03.243 に答える
2

def基本的に Vars のコンストラクタです。最初の引数は、Var に名前を付けるシンボルです。そのシンボルを受け取り、そのシンボルの Var を返します。破壊すると、これらのセマンティクスが変更されます。

ただし、それを行うマクロを作成することはできます。

于 2011-11-19T21:19:05.230 に答える