无法找到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。
