为什么 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
怎么了?
编辑:
我已确认名称空间已转移到所需的名称空间。请看下图:
这些是我遵循的确切步骤:
- 创建了一个文件
test.clj
并在其中添加了上述功能。
- 在 Intellij Idea 中左键单击此文件并选择选项
Switch REPL namespace to current file
。
- 在 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$
在编辑中添加:
- 首先,我创建了一个名为
tutorial.clj
的文件,其中包含 ns
形式和 defn
函数。
- 然后我用 CLASSPATH 中的当前目录 (
.
) 启动了一个 REPL,这样 Clojure 就知道从哪里加载文件了。
- 然后我使用
require
加载了文件。这会将函数定义加载到 tutorial
命名空间。
- 然后我使用
in-ns
函数将 REPL 的当前命名空间更改为 tutorial
。
- 然后我运行
clojure.repl/source
函数。
进一步编辑:
我认为我已经确定了您面临的问题。看起来您使用 IntelliJ 的方式是将文件的内容发送到 REPL,而不是 require
ing 文件。根据 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=>
当我在 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
怎么了?
编辑:
我已确认名称空间已转移到所需的名称空间。请看下图:
这些是我遵循的确切步骤:
- 创建了一个文件
test.clj
并在其中添加了上述功能。 - 在 Intellij Idea 中左键单击此文件并选择选项
Switch REPL namespace to current file
。 - 在 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$
在编辑中添加:
- 首先,我创建了一个名为
tutorial.clj
的文件,其中包含ns
形式和defn
函数。 - 然后我用 CLASSPATH 中的当前目录 (
.
) 启动了一个 REPL,这样 Clojure 就知道从哪里加载文件了。 - 然后我使用
require
加载了文件。这会将函数定义加载到tutorial
命名空间。 - 然后我使用
in-ns
函数将 REPL 的当前命名空间更改为tutorial
。 - 然后我运行
clojure.repl/source
函数。
进一步编辑:
我认为我已经确定了您面临的问题。看起来您使用 IntelliJ 的方式是将文件的内容发送到 REPL,而不是 require
ing 文件。根据 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=>