我们说我有一个这样定义的向量:
(def v '[test 1])
如何在let语句中使用此向量?我想做这样的事情:
(let v
test)
并返回1
。到目前为止我尝试过的所有东西都只是给了我:
java.lang.IllegalArgumentException: let requires a vector for its binding in user:1
答案 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))