【问题标题】:How to write a function that defines another function with given name如何编写一个定义另一个具有给定名称的函数的函数
【发布时间】:2016-02-27 21:54:18
【问题描述】:

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

【问题讨论】:

  • 你的问题不清楚。提供一些示例调用和预期结果。你所说的“应用所说的称呼”是什么意思?
  • 希望添加所需的输出可以阐明我的目标。

标签: clojure


【解决方案1】:

您的代码似乎假定def 像函数一样工作。尽管语法不同,但它非常不同,特别是您用作 def 的第一个参数的符号必须在编译时解析,而不是在运行时解析。因此,要在def 之上构建,您将倾向于使用宏,而不是函数。这是有问题的,因为虽然 2-args arity 需要宏,但 1-arg arity 最好由函数提供。

让我建议将工作拆分为一个函数和一个宏:

(defn salutation-maker [salutation]
  #(str % salutation))

(defmacro defsalutation [name salutation]
  `(def ~name (salutation-maker ~salutation)))

【讨论】:

  • 这如我所愿!'(defsalutation salut "-hello") (salut "tommy") => "tommy-hello"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2012-01-15
  • 2011-12-11
  • 1970-01-01
  • 2023-02-09
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多