为什么没有以def形式进行破坏?

Gab*_*ell 15 lisp function clojure destructuring let

在一个let形式(Clojure在这里)我可以做类似的事情

(let [[u s v] (svd A)] 
   (do-something-with u v))
Run Code Online (Sandbox Code Playgroud)

其中svd返回长度为3的列表.这是一件很自然的事情,为什么我们不这样做呢?

(def [u s v] (svd A))
Run Code Online (Sandbox Code Playgroud)

及其各种概括作为def表单的默认行为?我不知道这会如何干扰def已经在做的事情.理解Lisp或Clojure的Zen的人能解释为什么def不支持绑定(与解构)一样强大let吗?

ama*_*loy 16

def是编译器级别的一种特殊形式:它构成一个Var.def必须在解构之前可用且可用.你看到类似的东西let*,一个不支持解构的编译器原语:然后在clojure/core.clj语言中的几千行最终足够强大以提供一个let带有解构的版本,作为一个宏在上面let*.

如果你愿意,你可以写一个宏(比方说def+),为你做这个.就个人而言,我认为它有点粗暴,不会使用它,但使用Lisp意味着使用适合您个人的语言.