我不是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
答案 0 :(得分:3)
像这样跟踪事情的方式就是这样(假设,这是一个 常规源文件,我们在这里谈论常规Clojure)。
因此,如果您的编辑器或IDE没有帮助,但您在REPL中加载了该代码,则可以执行(source <fn)
。
如果有问题的函数/宏具有前缀名称(例如tools*/<fn
),
它有一个require
(例如(:require [my.ns.tools :as tools*])
)。
如果不是:
请确保该函数未事先在同一文件中定义。
请确保clojure.core
无效。例如。 in the cheatsheet
搜索require
和use
的内容,如(:require [my.ns.tools :refer :all])
,(:require [my.ns.tools :refer [<fn])
,(:use [my.ns.tools])
如果所有这些都无济于事,那么有可能这个功能是由其他东西为你创造的。该类别的示例是记录的构造函数(例如,->A
和map->A
用于记录A
)。 This is an example其中宏用于创建顶级函数。
荣誉奖(但在这种情况下没有用):SymbolHound
答案 1 :(得分:2)
虽然您的问题已经得到解答,但仍有一个很好的提示。每次看到没有命名空间的函数调用时(比如,只有(foo)
而不是(namespace/foo)
),这意味着函数是以三种方式之一注入的:
:use
宏中的ns
,例如(:use some.package)
; :require
中的ns
明确refer
:(:require [some.package :refer [foo]])
:require
引用包内的所有内容:(:require [some.package :refer :all])
因此,您应该检查位于文件顶部的ns
宏。但更好的方法是使用emacs + cider并按M-.
转到符号定义或至少某些具有相同功能的IDE。