无法找到Clojure函数的来源

时间:2017-05-25 08:03:28

标签: 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

2 个答案:

答案 0 :(得分:3)

像这样跟踪事情的方式就是这样(假设,这是一个 常规源文件,我们在这里谈论常规Clojure)。

因此,如果您的编辑器或IDE没有帮助,但您在REPL中加载了该代码,则可以执行(source <fn)

如果有问题的函数/宏具有前缀名称(例如tools*/<fn), 它有一个require(例如(:require [my.ns.tools :as tools*]))。

如果不是:

  1. 请确保该函数未事先在同一文件中定义。

  2. 请确保clojure.core无效。例如。 in the cheatsheet

  3. 搜索requireuse的内容,如(:require [my.ns.tools :refer :all])(:require [my.ns.tools :refer [<fn])(:use [my.ns.tools])

  4. 如果所有这些都无济于事,那么有可能这个功能是由其他东西为你创造的。该类别的示例是记录的构造函数(例如,->Amap->A用于记录A)。 This is an example其中宏用于创建顶级函数。

    荣誉奖(但在这种情况下没有用):SymbolHound

答案 1 :(得分:2)

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

  1. 通过:use宏中的ns,例如(:use some.package);
  2. 通过:require中的ns明确refer(:require [some.package :refer [foo]])
  3. 通过:require引用包内的所有内容:(:require [some.package :refer :all])
  4. 因此,您应该检查位于文件顶部的ns宏。但更好的方法是使用emacs + cider并按M-.转到符号定义或至少某些具有相同功能的IDE。