无法找到Clojure函数的来源
我不是Clojure程序员,但我的任务是将我们的体系结构的核心部分从当前的Clojure重写到Node中。 如果你喜欢Clojure,并且想知道为什么,我们无法在任何地方获得Clojure开发人员,而且JavaScript非常普遍(至少能够阅读它)。 这个组件本身很小且很简单,但是缺乏Clojure的专业知识现在真的让我们失望了。
我理解了大部分代码,但是我遇到了一个名为<fn
的函数,我无法在线找到(可能因为很难搜索特殊字符),Clojure文档或代码中的任何defn
。
这里有一点上下文
(comp (<fn plan/enqueue nil handle-internal-event)
(<fn doto mt/confirm!)
sanitize-object)
这将会做什么的线索? 这是一个我忽略的简单表达式,还是它可能是某种lisp宏观事物?
回答
原来,这是我的文件顶部所需的宏。
(:require [fletching.macros :refer :all])
对于任何对此函数的源代码感兴趣的人都可以在https://github.com/jdevuyst/fletching-macros
像这样跟踪事情的方式就像这样(假设这是一个常规的源文件,而且我们在这里定期讨论Clojure)。
因此,如果你的编辑器或者IDE没有帮助,但是你已经将代码加载到了REPL中,你可以这样做(source <fn)
。
如果所讨论的函数/宏具有前缀名称空间(例如tools*/<fn
),则require
它(例如(:require [my.ns.tools :as tools*])
)。
如果不:
请确保,该功能未事先在同一个文件中定义。
确保它不是clojure.core
功能。 例如在cheatsheet
搜索具有require
和use
东西,看起来像这样(:require [my.ns.tools :refer :all])
(:require [my.ns.tools :refer [<fn])
, (:use [my.ns.tools])
如果所有这些都没有帮助,那么有一个机会,就是这个功能是由别的东西为你创造的。 该类别的示例是记录的构造函数(例如->A
和map->A
用于记录A
)。 这是一个使用宏创建顶级函数的示例。
荣誉提及(但在这种情况下无用):SymbolHound
虽然你的问题已经得到解答,但有一个很好的提示。 每次你看到一个没有命名空间的函数调用(比如说,只是(foo)
而不是(namespace/foo)
),就意味着这个函数有三种注入方式:
:use
在ns
宏中:use
,例如(:use some.package)
; :require
在ns
中明确refer
(:require [some.package :refer [foo]])
:require
引用包中的所有内容:( (:require [some.package :refer :all])
所以你应该检查放在文件顶部的ns
宏。 但更好的方法是使用emacs +苹果酒和按M-.
去符号定义或至少一些具有相同功能的IDE。