Clojure:特定命名空间中的引导repl
我已经安装了bootclj,希望能够在外部编辑器中编辑.clj文件,并单独运行一个命令行REPL,从中可以调用我在.clj文件中更改的函数。不需要特殊的重新加载命令 另一件事是,我不想手动键入命令来包含名称空间——我只想运行一个脚本,将我引入名称空间,这样我就可以立即调用现有函数 文件名:Clojure:特定命名空间中的引导repl,clojure,boot-clj,Clojure,Boot Clj,我已经安装了bootclj,希望能够在外部编辑器中编辑.clj文件,并单独运行一个命令行REPL,从中可以调用我在.clj文件中更改的函数。不需要特殊的重新加载命令 另一件事是,我不想手动键入命令来包含名称空间——我只想运行一个脚本,将我引入名称空间,这样我就可以立即调用现有函数 文件名: C:\dev\my-project\src\my_project\utils.clj (ns my-project.utils (:require [clojure.string :as s])
C:\dev\my-project\src\my_project\utils.clj
(ns my-project.utils
(:require
[clojure.string :as s]))
(defn my-range [start end]
(take (- end start) (iterate inc start)))
文件中的某些内容:
C:\dev\my-project\src\my_project\utils.clj
(ns my-project.utils
(:require
[clojure.string :as s]))
(defn my-range [start end]
(take (- end start) (iterate inc start)))
我想直接进入REPL并进入(我的范围0 3)
,看看它是否产生我想要的结果
这个的设置是什么?我需要运行的脚本文件是什么样子的
我目前的理解是,答案如下:
(deftask dev-repl
(set-env! …)
(repl))
my-project.utils=> (require 'my-project.utils :reload)
nil
在命令行
您可以在某种程度上通过命令行实现这一点,而无需创建build.boot
文件:
在C:\dev\my\u项目中:
:使用“资源路径”上的boot-r src
启动,该路径是JVM中可访问的目录集src
启动一个repl,需要您的命名空间,然后输入它repl-n my project.utils
C:\dev\my\u project\src\my\u project\utils.clj
之后,您可以在REPL处重新加载它,如下所示:
(deftask dev-repl
(set-env! …)
(repl))
my-project.utils=> (require 'my-project.utils :reload)
nil
最小build.boot
或者,您可以使用以下内容创建文件C:\dev\my\u project\build.boot
:
(set-env! :resource-paths #{"src"})
(deftask dev
"Run a development REPL"
[]
(repl :init-ns 'my-project.utils))
然后,在C:\dev\my\u项目中
:
boot dev
它还将在您的命名空间中启动REPL,但需要的命令行配置较少,因为我们在build.boot
中执行了配置,而boot
将自动评估该配置
注意:从Clojure REPL中,无论构建工具如何,都可以使用require
函数要求任何名称空间(只要它位于JVM的类路径上),并使用ns函数中的输入它
使用自动重新加载的build.boot
最后,可以结合Boot的特性来实现一个面向自动重新加载代码的开发工作流
在C:\dev\my\u project\build.boot
中:
在C:\dev\my\u project\src\my\u project\load\u impl.clj
中:
在C:\dev\my\u project\src\my\u project\utils.clj
:
返回命令提示符,键入bootdev
。您应该会看到一些println
输出,每次编辑和保存文件时,您都会再次看到它,反映您所做的任何更改。非常感谢-这将允许我运行代码,而无需每次重新启动新的JVM。我想知道(require…
)是否可以以某种方式放在历史记录的第一位,这样只需几次向上击键,或者转换为类似r
?您可以在REPL处键入Ctrl-r来搜索命令历史记录。您还可以在名称空间中添加一个函数,并使用(r)从REPL调用它:(defnr[](require…)我喜欢(r)
技巧(即使这是一个特殊的重载命令)。有趣的是,如果我更改了一个函数的名称,旧函数仍然在名称空间中。我是SO的新手,不确定是否通知了您,但我对我的答案进行了重大编辑。它现在包括自动重新加载设置的说明,我希望你会喜欢。是的,我看到了,谢谢,这意味着你完美地回答了这个问题。我现在坚持使用(r)
技巧,因为它基本上满足了我的需要,而且运动部件比真实答案少。