Clojure:特定命名空间中的引导repl

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])

我已经安装了bootclj,希望能够在外部编辑器中编辑.clj文件,并单独运行一个命令行REPL,从中可以调用我在.clj文件中更改的函数。不需要特殊的重新加载命令

另一件事是,我不想手动键入命令来包含名称空间——我只想运行一个脚本,将我引入名称空间,这样我就可以立即调用现有函数

文件名:

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
    :使用“资源路径”上的
    src
    启动,该路径是JVM中可访问的目录集
  • repl-n my project.utils
    启动一个repl,需要您的命名空间,然后输入它
REPL运行时,在编辑了
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)
技巧,因为它基本上满足了我的需要,而且运动部件比真实答案少。