1
我試圖編寫一個宏來比較多個表達式的運行時間,並將其運行到牆上。我的問題可以濃縮爲下面的代碼:使用可變參數宏作爲列表
(defmacro test-m [& exprs]
`(map #(.toString %) ~exprs))
如果我把這種喜歡(test-m 1 2 3)
,我希望它可以沿着線生產代碼:
(map #(.toString %) [1 2 3])
這是完全有效的。但不幸的是,這實際上導致一個錯誤:
ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn helpers.general-helpers/eval663 (NO_SOURCE_FILE:76)
的唯一途徑,我可以看到這個可能發生的事情是,如果& exprs
導致(1 2 3)
,那麼這將嘗試調用1
的功能,這顯然是錯誤的。
如何映射宏中的可變參數列表?
你可能不想引用它,而是寫'(list〜@ exprs)'或'〜(vec exprs)'。 – amalloy
@amalloy最後有什麼不同?引用它似乎更直接。我並不想爭辯;我很好奇。 – Carcigenicate
用x y z變量而不是1 2 3個常量嘗試。 – amalloy