我試圖使用引用將seq-exprs
傳遞給for
,但是我的兩次嘗試均導致CompilerException java.lang.IllegalArgumentException: for requires a vector for its binding
。我顯然誤解了引用和評估(以及相關概念)如何工作。將seq-exprs傳遞給使用引用
(let [v ['b (range 2)]]
(for v b))
(let [v '[b (range 2)]]
(for v b))
什麼是做了正確的方式,你會如何解釋begineer沒有上述工作的實現,爲什麼?謝謝!
編輯:
我知道我可以做
(let []
(for [b (range 2)] b))
我想要實現的是能夠通過綁定的載體(如另一個函數的輸出)
編輯2 ,動機/背景:
我正在構建一個轉譯器[repo],我正在嘗試翻譯和展開一個for循環(包括嵌套循環,example),所以我認爲我可以追加要迭代的範圍變量seq-exprs
通過嵌套循環更深入地遍歷AST(抽象語法樹),然後評估在給定由clojure for
生成的'綁定'的每個原始塊中包含的翻譯關係(關係總是可以逐個翻譯)。如果有更好的方法可以做到,你有什麼建議嗎?
最後你想有這樣的事情:(for [i(0 1)])?你想實現什麼?你可以這樣使用:(對於[我(範圍2)](println「我是:」我)),也需要像這樣的矢量綁定 - > [<你的表達式] –
這是一個最小的例子 - 我希望能夠將矢量'seq-exprs'作爲變量傳遞給'for'。 – tales
因爲'for'是一個宏,它在編譯時被擴展,這意味着綁定向量應該是一個文字向量,而不是一個var,你試圖做的事情是完全不可能的(編譯器只是不知道運行時值'v')。你可以做的是使用另一個返回'for'宏的宏(它仍然不能在'v'的運行時值上操作)或者你可以使用'eval',這是不好的。爲什麼你甚至想這樣做? – leetwinski