【发布时间】:2019-02-08 06:57:54
【问题描述】:
假设我想在本地范围内定义两个相互递归的函数。我可以用 letfn 做到这一点:
(letfn
[(f [x] (if (= x 0) (g x) true))
(g [x] (if (= x 1) (f x) false))]
(f 0))
但与let 相比,letfn 受到很大限制,因为它只接受“函数规范”,而不接受任意表达式。我的问题是:如果我想将元数据(使用with-meta)附加到f 和g,以便在f 内,我可以读取g 的元数据,在g 内,我可以读取f 的元数据吗?这在 Clojure 中可行吗?
(对于上下文,我正在尝试实现一个类似fn 的宏,该宏会自动将某些元数据附加到正在创建的函数中。我希望这些自动注释的fns 可以在普通Clojure 函数的任何地方进行实例化是,包括在letfn 中。但我不知道如何定义一个类似letfn 的宏来附加元数据,因为它最终必须对letfn 进行脱糖,它不能附加元数据。)
【问题讨论】:
-
这一切的目的是什么?将元数据附加到函数很少有用,我想它在单个词法范围内的用处会更小,因为所有附近的函数无论如何都“知道”彼此。
-
@amalloy 用例是在 Clojure 中嵌入一种新语言。该语言的“入口点”是特殊的宏,其语法与
fn/letfn/defn相同,但将附加元数据附加到定义的函数对象。该语言中的函数可以像常规 Clojure 函数一样执行,但也可以以其他方式执行——对于那些,元数据是必要的。
标签: clojure