如何在Clojure中传递预定义的向量?

时间:2016-03-16 10:32:12

标签: clojure

我们说我有一个这样定义的向量:

(def v '[test 1])

如何在let语句中使用此向量?我想做这样的事情:

(let v
   test)

并返回1。到目前为止我尝试过的所有东西都只是给了我:

java.lang.IllegalArgumentException: let requires a vector for its binding in user:1

2 个答案:

答案 0 :(得分:1)

你不能这样做因为let是一个宏/特殊形式,它在其体内引入了绑定。在正常的clojure语义中,var ALTER TABLE shop_articles_images ADD CONSTRAINT shop_articles_images_ibf5 FOREIGN KEY (article_id) REFERENCES shop_articles (id) ON DELETE CASCADE; 在运行时可以具有任何值,这将使得编译let块成为不可能。换句话说,绑定向量必须是已知的并在编译时固定。此外,由于let块的主体是静态的,因此没有理由使绑定列表变量。

设置本地绑定的常规方式"动态"在评估"静态"表达式是使用函数,即

v

如果你想生成let绑定(也可能是let body),你需要a macro。虽然this sounds more like an X-Y problem。所以,如果函数不能为你工作,也许你想扩展为什么你认为你需要这个结构。

答案 1 :(得分:0)

仅获取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))