是否可以在绑定中构造地图?

时间:2013-05-24 03:07:58

标签: clojure destructuring

是否可以在一个功能中执行此操作:

(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的函数,但我不确定这是否相关。

2 个答案:

答案 0 :(得分:2)

不,这样的任何内容都不适用于核心宏。

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

let中,解构具有明确的含义:它引入了新的本地化,这正是基本的,非解构let绑定所做的。这也显然是有用的,因为撬开appart数据结构并将不同部分绑定到不同的本地是常见的需要。本地人的名字也是在本地确定的,因此关联解构中:keys之类的东西运作良好。

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


对于destructuring-bind,它基本上是Common Lisp中的let的解构启用版本。 CL的let不支持解构。

答案 1 :(得分:1)

“绑定表格(解构)”section

  

Clojure支持抽象结构绑定,通常称为   解构,允许绑定列表,fn参数列表和任何宏   扩展为let或fn。 ...

AFAIK binding本身不使用解构机制(通过fn的{​​{1}})。