为什么 clojure.repl/source 不适用于我的自定义函数

Why clojure.repl/source does not works for my custom functtion

当我在 repl 中执行 clojure.repl/source activate 时,它给了我激活函数的来源。

现在,我在命名空间 tutorial.test

中定义了一个自定义函数
(ns tutorial.test)
    (defn return_type_of_arg
        [x]
        (type x)
)

将 repl 命名空间切换到 tutorial.test 并在 repl 中加载此文件后,我尝试执行 clojure.repl/source return_type_of_arg.

它给我的输出是 Source not found

怎么了?

编辑:

我已确认名称空间已转移到所需的名称空间。请看下图:

这些是我遵循的确切步骤:

  1. 创建了一个文件 test.clj 并在其中添加了上述功能。
  2. 在 Intellij Idea 中左键单击此文件并选择选项 Switch REPL namespace to current file
  3. 在 Intellij Idea 中左键单击此文件并选择选项 Load file in REPL.

下面是一个 REPL 会话的 t运行脚本,它显示了完成这项工作的步骤。

dorabs-imac:tmp dorab$ cat tutorial.clj
(ns tutorial)

(defn return_type_of_arg
  [x]
  (type x))
dorabs-imac:tmp dorab$ clj -Sdeps '{:paths ["."]}'
Clojure 1.10.3
user=> (require 'tutorial)
nil
user=> (in-ns 'tutorial)
#object[clojure.lang.Namespace 0x187eb9a8 "tutorial"]
tutorial=> (clojure.repl/source return_type_of_arg)
(defn return_type_of_arg
  [x]
  (type x))
nil
tutorial=> 

dorabs-imac:tmp dorab$ 

在编辑中添加:

  1. 首先,我创建了一个名为 tutorial.clj 的文件,其中包含 ns 形式和 defn 函数。
  2. 然后我用 CLASSPATH 中的当前目录 (.) 启动了一个 REPL,这样 Clojure 就知道从哪里加载文件了。
  3. 然后我使用 require 加载了文件。这会将函数定义加载到 tutorial 命名空间。
  4. 然后我使用 in-ns 函数将 REPL 的当前命名空间更改为 tutorial
  5. 然后我运行 clojure.repl/source 函数。

进一步编辑:

认为我已经确定了您面临的问题。看起来您使用 IntelliJ 的方式是将文件的内容发送到 REPL,而不是 requireing 文件。根据 source 的文档,“打印给定符号的源代码,如果它能找到的话。 这要求符号解析为定义在 a 中的 Var .clj 在类路径中的命名空间 。”[强调我的]。因此,当文件内容直接发送到 REPL(不使用 require)时,没有 .clj 文件以查找 source 的源代码。下面的 t运行 脚本演示了这一点。比较下面的 t运行 脚本和上面的 t运行 脚本确实有效。

dorabs-imac:tmp dorab$ clj
Clojure 1.10.3
user=> (ns tutorial)

(defn return_type_of_arg
  [x]
  (type x))

nil
tutorial=> tutorial=> #'tutorial/return_type_of_arg
tutorial=> tutorial=> (clojure.repl/source return_type_of_arg)
Source not found
nil
tutorial=>