是否可以在一个功能中执行此操作:
(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
的函数,但我不确定这是否相关。
答案 0 :(得分:2)
不,这样的任何内容都不适用于核心宏。
原因是binding
和let
(和朋友,例如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}})。