如何编写一个定义具有给定名称的另一个函数的函数

Jas*_*ese 1 clojure

这是我的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)

Val*_*nck 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)))
Run Code Online (Sandbox Code Playgroud)