我正在通過優秀的書讓Lambda,我試圖將Common Lisp代碼移植到Clojure。沒有parens反引號
下面的命令生成一個應該採取
(defn defunits-chaining [u units prev]
(if (some #(= u %) prev)
(throw (Throwable. (str u " depends on " prev))))
(let [spec (first (filter #(= u (first %)) units))]
(if (nil? spec)
(throw (Throwable. (str "unknown unit " u)))
(let [chain (second spec)]
(if (list? chain)
(* (first chain)
(defunits-chaining
(second chain)
units
(cons u prev)))
chain)))))
(defmacro defunits [quantity base-unit & units]
`(defmacro ~(symbol (str "unit-of-" quantity))
[valu# un#]
`(* ~valu#
~(case un#
~base-unit 1
[email protected](map (fn [x]
`(~(first x) ;; <-- PRETTY SURE IT'S THIS `(
~(defunits-chaining
(first x)
(cons `(~base-unit 1)
(partition 2 units))
nil)))
(partition 2 units))))))
(defunits time s m 60 h 3600)
並把它變成一個可以稱爲像
宏,並給在基座單元的結果的宏(秒這個案例)。我認爲問題是「案例」中的Clojure/CL API改變。 「案例」,在CL看起來是這樣的:
(case 'a (('b) 'no) (('c) 'nope) (('a) 'yes))
但Clojure中......
(case 'a 'b 'no 'c 'nope 'a 'yes)
多麼方便。我在嵌套defmacro改變了我的匿名功能,但它一直像產生
(case un#
s 1
(m 60)
(h 3600)
如何防止那些外的括號?
+1「flatten」的完美描述 – 2013-05-03 03:42:38
這正是我之前想要的,我想我需要在clojure標準函數中進行一些挖掘。 – 2013-05-03 04:17:06
是的,再看一遍這個問題,這是*正確的答案。 – 2013-05-03 04:23:52