如何传递预定义向量以允许Clojure进入?
假设我有一个定义如下的向量:如何传递预定义向量以允许Clojure进入?,clojure,Clojure,假设我有一个定义如下的向量: (def v '[test 1]) (let v test) 如何在let语句中使用此向量?我想这样做: (def v '[test 1]) (let v test) 然后返回1。到目前为止,我所做的一切都给了我: java.lang.IllegalArgumentException: let requires a vector for its binding in user:1 您不能这样做,因为let是一种在其主体中引入绑定的宏/特殊形式。
(def v '[test 1])
(let v
test)
如何在let语句中使用此向量?我想这样做:
(def v '[test 1])
(let v
test)
然后返回1
。到目前为止,我所做的一切都给了我:
java.lang.IllegalArgumentException: let requires a vector for its binding in user:1
您不能这样做,因为let是一种在其主体中引入绑定的宏/特殊形式。在正常的clojure语义中,var
v
在运行时可以有任何值,这将导致无法编译let块。换句话说,绑定向量必须在编译时已知并固定。另外,由于let块的主体是静态的,所以没有理由使绑定列表变为变量
在计算“静态”表达式时,“动态”设置本地绑定的常规方法是使用函数,即
(defn let-v [v]
v)
(def test 1)
(let-v test)
如果您想生成let绑定(可能还有let主体),您需要。不过。因此,如果函数不适合您,您可能想进一步说明为什么需要此构造。仅获取
1
值的正确方法(如示例中所示):
作为函数调用中的值提取-添加分解:
(def v [x 1])
(defn let-v
[[_ i]]
i)
(let-v v) ; => 1
在let
语句中,情况大致相同:
(dev v [x 1])
(let [[_ i] v]
i)
显然,要将向量传递到函数中,但分解发生在函数中的let
:
(def v [x 1])
(defn let-v
[v]
(let [[_ i] v]
i))