我从以下代码开始(想像的还不止于此,但我认为这很重要):
(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")))
我的下一张通行证是这样的:
(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")))
有没有办法将其归结为:
(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")))
(我在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))))
那么您将可以使用它来定义任意数量的函数:
(items-defn "fun1" "funA" "funOne" "funBee")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句