Jon*_*tow 2 macros dry clojure
我开始使用以下代码(想象不止这些,但我认为这得到了重点):
(defn fun1 [arg] {:fun1 arg})
(defn funA [arg] {:funA arg})
(defn funOne [arg] {:funOne arg})
(defn funBee [arg] {:funBee arg})
(defn -main [& args] (prn (fun1 "test-data")))
Run Code Online (Sandbox Code Playgroud)
我的下一个传递使它如此:
(defmacro item-defn [a]
`(defn ~(symbol a) [arg#] {~(keyword a) arg#}))
(item-defn "fun1")
(item-defn "funA")
(item-defn "funOne")
(item-defn "funBee")
(defn -main [& args] (prn (fun1 "test-data")))
Run Code Online (Sandbox Code Playgroud)
有没有办法把它归结为:
(defmacro item-defn [a]
`(defn ~(symbol a) [arg#] {~(keyword a) arg#}))
(map #(item-defn %) ["fun1" "funA" "funOne" "funBee"])
(defn -main [& args] (prn (fun1 "test-data")))
Run Code Online (Sandbox Code Playgroud)
(我尝试在repl中,它似乎工作,但当我加载它的clj文件,然后它不起作用.它给我一个"CompilerException""无法解析符号:fun1")
我在滥用宏吗?你会怎么做?
您可以为此目的定义另一个宏,例如:
(defmacro item-defn [a]
`(defn ~(symbol a) [arg#] {~(keyword a) arg#}))
(defmacro items-defn [& names]
`(do ~@(for [n names] `(item-defn ~n))))
Run Code Online (Sandbox Code Playgroud)
然后你就可以用它来定义任意数量的函数:
(items-defn "fun1" "funA" "funOne" "funBee")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |