Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何传递预定义向量以允许Clojure进入?_Clojure - Fatal编程技术网

如何传递预定义向量以允许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))