0

是否可以在一个功能中做到这一点:

(binding [*configs* (merge default-configs configs)]
    (let [{:keys [login url max-pages]} *configs*]
      ..

当我尝试这个时:

(binding [{:keys [login url max-pages] :as *configs*} (merge default-configs configs)]

它给了我这个错误:

CompilerException java.lang.ClassCastException:clojure.lang.PersistentArrayMap 无法转换为 clojure.lang.Symbol

一点谷歌搜索向我展示了 Common Lisp 有一个名为的函数,destructure-bind但我不确定这是否相关。

4

2 回答 2

2

不,这样的东西不适用于核心宏。

原因是bindinglet(以及朋友,例如with-bindings)都只做一件事。在 的情况下binding,那是为 Vars 安装线程本地绑定;因为let,它正在引入本地绑定。这些是完全不同的操作。

let中,解构具有明确的含义:它引入了新的局部变量,这正是基本的非解构let绑定所做的。这显然也很有用,因为窥探 appart 数据结构并将不同的部分绑定到不同的本地是一种常见的需求。本地人的名字也是本地确定的,所以像:keys关联解构这样的东西效果很好。

binding中,为了与其主要目的保持一致,解构需要同时将多个 Var 绑定到数据结构的多个部分。这几乎没有那么有用。如果相反,解构binding是要引入本地人,那么突然之间binding会做两件不相关的事情,可能都在同一个绑定对中(请注意binding问题文本中的失败表单如何期望引入的绑定:keys是本地人,但绑定通过:as成为 Var 通常的线程本地绑定)。因此binding只是选择不支持解构。(如果您需要将数据结构的一部分绑定到多个 Var,您可以使用 alet执行解构,然后使用 安装绑定binding。)


至于destructuring-bind,它基本上是letCommon Lisp 中支持解构的版本。CLlet不支持解构。

于 2013-05-24T03:32:13.893 回答
1

“绑定表单(解构)”部分

Clojure 在 let 绑定列表、fn 参数列表以及任何扩展为 let 或 fn 的宏中支持抽象结构绑定,通常称为解构。...

AFAIKbinding本身不使用解构机制(通过fnof let)。

于 2013-05-24T03:30:28.190 回答