这是我的clojure代码:
(defn salutation-adder-maker
([salutation call]
(def call (salutation-adder-maker salutation)))
([salutation]
#(str % salutation))
)
(salutation-adder-maker "-Thanks!" salutation1)
(salutation1 "Help me!")
Run Code Online (Sandbox Code Playgroud)
底部的两行代码给出了无法解析符号的错误salutation1.函数编译很好,但这是因为它将函数定义为call.因此以下代码有效:
(call "Help me!")
Run Code Online (Sandbox Code Playgroud)
它吐了出来
Help me-Thanks!
Run Code Online (Sandbox Code Playgroud)
而不是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!"
Run Code Online (Sandbox Code Playgroud)
你的代码似乎假设def像函数一样工作.尽管有语法,但它非常不同,特别是你用作def的第一个参数的符号必须在编译时解析,而不是在运行时解析.因此,要构建在上面def,您将倾向于使用宏,而不是函数.这是有问题的,因为虽然2-args arity需要一个宏,但1-arg arity最好由函数提供.
我建议将工作分为函数和宏:
(defn salutation-maker [salutation]
#(str % salutation))
(defmacro defsalutation [name salutation]
`(def ~name (salutation-maker ~salutation)))
Run Code Online (Sandbox Code Playgroud)