在 let
形式(这里是 Clojure)中,我可以做类似的事情
(let [[u s v] (svd A)]
(do-something-with u v))
其中 svd
返回长度为三的列表。这是一种非常自然的事情,所以我们为什么不这样做
(def [u s v] (svd A))
及其各种概括作为 def
形式的默认行为?我看不出这会如何干扰 def
已经在做的事情。了解 Lisp 或 Clojure 的 Zen of Lisp 或 Clojure 的人可以解释为什么 def
不支持像 let
一样强大的绑定(bind)(解构)吗?
最佳答案
def
是编译器级别的一种特殊形式:它生成一个 Var。在解构可用之前,def
必须可用且可用。您会看到与 let*
类似的东西,它是一种不支持解构的编译器原语:然后在 clojure/core.clj
几千行之后,该语言终于强大到足以提供一个let
的解构版本,作为 let*
之上的宏。
如果需要,您可以编写一个宏(例如,def+
)来为您执行此操作。我个人认为它有点恶心并且不会使用它,但是使用 Lisp 意味着开始使用适合您个人的语言。
关于clojure - 为什么不以 def 形式破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8197329/