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

  • 搜索具有requireuse东西,看起来像这样(:require [my.ns.tools :refer :all]) (:require [my.ns.tools :refer [<fn])(:use [my.ns.tools])

  • 如果所有这些都没有帮助,那么有一个机会,就是这个功能是由别的东西为你创造的。 该类别的示例是记录的构造函数(例如->Amap->A用于记录A )。 这是一个使用宏创建顶级函数的示例。

    荣誉提及(但在这种情况下无用):SymbolHound


    虽然你的问题已经得到解答,但有一个很好的提示。 每次你看到一个没有命名空间的函数调用(比如说,只是(foo)而不是(namespace/foo) ),就意味着这个函数有三种注入方式:

  • 通过:usens宏中:use ,例如(:use some.package) ;
  • 通过:requirens中明确refer (:require [some.package :refer [foo]])
  • via :require引用包中的所有内容:( (:require [some.package :refer :all])
  • 所以你应该检查放在文件顶部的ns宏。 但更好的方法是使用emacs +苹果酒和按M-. 去符号定义或至少一些具有相同功能的IDE。

    链接地址: http://www.djcxy.com/p/33633.html

    上一篇: Unable to locate the source of a Clojure function

    下一篇: Dollar sign ($) in clojure symbol name