【发布时间】:2014-03-01 15:25:40
【问题描述】:
如何在 Clojure 中获取函数名作为字符串?
到目前为止,我所拥有的一切看起来都不是惯用的:
(defn fn-name
[f]
(first (re-find #"(?<=\$)([^@]+)(?=@)" (str f))))
(defn foo [])
(fn-name foo) ;; returns "foo"
编辑:根据提供的提示,我整理了一个基本宏,可以满足我的需求。是不是更好看?
(defmacro fn-name
[f]
`(-> ~f var meta :name str))
【问题讨论】:
-
这个宏有什么意义?它只能在文字上工作,比如
(fn-name inc),而(let [f inc] (fn-name f))会失败。如果您按字面意思输入inc,您可以直接输入"inc"并保存一些字符! -
这是它的局限性。正如@noisesmith 提到的,它适用于来自同一命名空间的
defns。将函数名称也键入为字符串不是我的选择。我正在寻找如何获取作为参数传递的任何函数的名称。 -
这样的函数有名字吗?
-
没有。正如 Sean Devlin (groups.google.com/d/msg/clojure/ORRhWgYd2Dk/kxauUUhQjbsJ) 所写,函数对象没有名称。只有函数绑定的符号有一个。我本可以让我的问题更清楚。
标签: clojure