【发布时间】:2017-11-01 19:15:31
【问题描述】:
我正在尝试创建一个 Clojure 函数,它返回另一个具有自定义名称的函数。到目前为止我的尝试:
(defn function-with-custom-name [name] (fn name [] 42))
(function-with-custom-name "hello")
# --> #object[lang.main$function_with_custom_name$name__4660 0xa6afefa "lang.main$function_with_custom_name$name__4660@a6afefa"]
# syntactically ok, but its name is 'name' and not 'hello'
(defn function-with-custom-name [name] (fn (symbol name) [] 42))
# --> CompilerException java.lang.IllegalArgumentException: Parameter declaration symbol should be a vector, compiling:(/tmp/form-init3365336074265515078.clj:1:40)
(defn function-with-custom-name [name] (fn '(symbol name) [] 42))
# --> CompilerException java.lang.IllegalArgumentException: Parameter declaration quote should be a vector, compiling:(/tmp/form-init3365336074265515078.clj:1:40)
我知道fn 是一个宏,因此正确引用可能对参数很重要,但如上所述,我无法正确理解,但我 99% 确定有办法,因为 (查看fn的出处,唯一的标准是第一个参数应该被识别为符号。
关于如何做到这一点的任何提示?
编辑:用例,如评论中所问:我正在用 Clojure 编写一个简单的语言解释器,它(除其他外)允许您创建函数。我的语言中的函数目前由匿名 Clojure 函数表示。但是,如果 Clojure 函数也有名称,那么调试解释器会容易得多。
EDIT2:第一次编辑让我思考,我得出的结论是我不能使用基于宏的解决方案来解决这个问题,因为我需要创建函数运行时(并且,据我记得,宏只能在编译时工作)。 --> 为了清楚起见,更改了问题标题。不过,请不要删除基于宏的答案,因为它们会提供有用的见解。
【问题讨论】:
-
你能澄清一下这个用例吗(即为什么你在运行时创建 fn 以及如何使用它)?
-
@AlanThompson:见编辑。