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

时间:2016-02-27 21:54:19

标签: 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!")

底部的两行代码会出现无法解析符号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!"

1 个答案:

答案 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)))