【问题标题】:Unable to locate the source of a Clojure function无法找到 Clojure 函数的来源
【发布时间】:2017-10-25 19:15:53
【问题描述】:

我不是 Clojure 程序员,但我的任务是将我们架构的核心部分从当前的 Clojure 重写为 Node。如果您喜欢 Clojure 并且想知道为什么,我们无法在任何地方找到 Clojure 开发人员,而且 JavaScript 非常通用(至少能够阅读它的一部分)。组件本身足够小且足够简单,但目前缺乏 Clojure 专业知识确实让我们望而却步。

我了解大部分代码,但我在 Clojure 文档或任何 @987654323 中都遇到了一个名为 <fn 的函数,我在网上找不到(可能是因为很难搜索特殊字符) @ 在我们的代码中。

这里有一点上下文

(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

【问题讨论】:

  • 该文件的requireuse 应该很明显(或者在use 的情况下使选择更小)。如果这没有帮助,它要么是预先在同一个文件中定义的,要么是来自核心(它不是)。在 REPL 你也可以(source &lt;fn).
  • 我猜它类似于(fn &lt;fn [f &amp; args] #(apply f % args))
  • 啊。搞定了,我在我的需求中找到了[fletching.macros :refer :all],github 有它的 API。如果您添加为答案,我会标记它
  • 据我所知(从工作讨论和远程工作松弛组),愿意远程工作的 Clojure 开发人员数量过剩。这与“无法在任何地方找到 Clojure 开发人员”不一致。
  • @ChrisMurphy 我不是老板,也没有任何权力决定我们在 Clojure 领域雇用或不雇用谁(您可能从我的问题中看出原因)。这就是我被告知的问题。如果你要愤世嫉俗,你可以说这是因为 Clojure 开发人员更昂贵,我们没有很多 Clo​​jure 代码,所以他们不想要另一个完整的计时器实际上是有道理的。

标签: clojure


【解决方案1】:

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

因此,如果您的编辑器或 IDE 没有帮助,但您在 REPL 中加载了该代码,您可以使用 (source &lt;fn)

如果有问题的函数/宏有一个命名空间前缀(例如tools*/&lt;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 [&lt;fn])(:use [my.ns.tools])的东西

如果所有这些都没有帮助,那么有可能这个函数是由其他东西为你创建的。该类别的示例是记录的构造函数(例如,-&gt;Amap-&gt;A 用于记录 A)。 This is an example 宏用于创建顶级函数。

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

【讨论】:

  • 非常感谢。我的案例是 3 号,我找不到对实际文本 &lt;fn 的引用,因为它是 :refer :all 所要求的。
【解决方案2】:

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

  1. 通过:usens 宏中,例如(:use some.package);
  2. 通过:requirens 中使用显式refer: (:require [some.package :refer [foo]])
  3. 通过:require 引用包内的所有内容:(:require [some.package :refer :all])

因此,您应该检查位于文件顶部的ns 宏。但更好的方法是使用 emacs + cider 并按 M-. 转到符号定义或至少一些具有相同功能的 IDE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 2012-12-10
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多