2012-10-20 22 views
2

是否有任何(合理)的方式來編寫這個宏作爲一個函數?Clojure:如何將剩餘參數「&args」發送到列表中?

(defmacro assocTop 
      [v & args] 
      `(push (pop ~v) 
       (assoc (peek ~v) [email protected]))) 

給定地圖和一些關聯的矢量,宏代碼將關聯應用於頂部/窺視地圖。

但是,當試圖將其作爲函數編寫時,我無法弄清楚如何以合法的方式擴展[email protected]。在正常的功能中,是否有辦法將args,我認爲它的形式(:a 3 :bb 44 :cd 90,...):a 3 :bb 44 :cd 90,...,即。沒有父母?

回答

4

我想你應該使用apply這將應用assoc(peek v)和擴展args

(defn assocTop 
    [v & args] 
    (push (pop v) 
     (apply assoc (peek v) args))) 
(= 
    (assocTop [{:a :b} {:c :d} {:e :f, :g :h}] :e :z) 
    [{:a :b} {:c :d} {:g :h, :e :z}]) ; => true 
+0

爲什麼'reduce'不在這裏工作了,但有工作的,比方說,'(DEFN推 [V&參數](減少連詞v參數))'? – spacingissue

+0

@spacingissue,在這種情況下,我不明白你想如何使用'reduce'。你能詳細說明嗎? – Jan

+0

我想我在考慮在答案上重複應用assoc會和reduce一樣。對「推」情況有何區別(您對答案重複應用連詞)? – spacingissue