这是我的clojure代码:
(defn salutation-adder-maker
([salutation call]
(def call (salutation-adder-maker salutation)))
([salutation]
#(str % salutation))
)
(salutation-adder-maker "-Thanks!" salutation1)
(salutation1 "Help me!")
底部的两行代码会出现无法解析符号salutation1
的错误。函数编译很好,但这是因为它将函数定义为call
。因此,以下代码有效:
(call "Help me!")
吐出来
Help me-Thanks!
而不是具有该功能的函数salutation1
。如何更改代码,以便salutation1
执行与call
当前相同的操作?
我希望能够传递两个参数:
例如:
(salutation-adder-maker "-Have a good day!" day_salutation)
(day_salutation "I will talk to you later")=>"I will talk to you later-Have a good day!"
答案 0 :(得分:6)
您的代码似乎假设def
的功能类似于函数。尽管有语法,但它非常不同,特别是你用作def的第一个参数的符号必须在编译时解析,而不是在运行时解析。因此,要构建在def
之上,您将倾向于使用宏,而不是函数。这是有问题的,因为虽然2-args arity需要一个宏,但是1-arg arity最好由函数提供。
我建议将工作分成一个函数和一个宏:
(defn salutation-maker [salutation]
#(str % salutation))
(defmacro defsalutation [name salutation]
`(def ~name (salutation-maker ~salutation)))