clojure - 为什么不以 def 形式破坏?

标签 clojure lisp let function destructuring

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/

相关文章:

recursion - Racket/Scheme 中的 zip 函数

Clojure:不变性和持久性

lisp - 通过嵌套列表 LISP 递归

recursion - 在 lisp 代码中修复这个未定义的函数?

Javascript - 在浏览器中从另一个模块设置一个 'let' 变量

record - 在 Z3 中编码 let 表达式

C# 在 LINQ 中定义 LET

clojure - 如何更新/覆盖具有基数很多的 ref 属性?

asynchronous - 使用 core.async 阻塞客户端/驱动程序 : are there performance benefits?

Clojure 命名空间