首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure:在特定名称空间中启动repl

Clojure:在特定名称空间中启动repl
EN

Stack Overflow用户
提问于 2015-11-29 12:01:20
回答 1查看 1.4K关注 0票数 7

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

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

档案名称:

代码语言:javascript
复制
C:\dev\my-project\src\my_project\utils.clj

文件中的某些内容:

代码语言:javascript
复制
(ns my-project.utils
  (:require
    [clojure.string :as s]))

(defn my-range [start end]
  (take (- end start) (iterate inc start)))

我想直接进入REPL,然后转到(my-range 0 3),看看它是否产生了我想要的结果。

这是怎么安排的?我需要运行的脚本文件是什么样子的?

我目前的理解是,答案是这样的:

代码语言:javascript
复制
(deftask dev-repl
  (set-env! …)
  (repl))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 02:42:23

在命令行

您可以在命令行中在某种程度上实现这一点,而无需创建build.boot文件:

在C:\dev\my_project中

代码语言:javascript
复制
boot -r src repl -n my-project.utils
  • boot -r src:在“资源路径”上以src启动,这是一组可以在JVM中访问的目录。
  • repl -n my-project.utils启动一个REPL,需要您的命名空间并输入它。

在REPL运行时,在编辑了C:\dev\my_project\src\my_project\utils.clj之后,您可以在REPL中重新加载它,如下所示:

代码语言:javascript
复制
my-project.utils=> (require 'my-project.utils :reload)
nil

极小build.boot

或者,您可以创建包含以下内容的文件C:\dev\my_project\build.boot

代码语言:javascript
复制
(set-env! :resource-paths #{"src"})

(deftask dev 
  "Run a development REPL"
  []
  (repl :init-ns 'my-project.utils))

然后,在C:\dev\my_project

代码语言:javascript
复制
boot dev

它还将在您的命名空间中启动REPL,但需要更少的命令行配置,因为我们已经在build.boot中执行了配置,boot将自动评估该配置。

注意:无论构建工具如何,您都可以使用require函数请求任何名称空间(只要它位于JVM的类路径上),并使用in-ns函数输入它。

自动重装的build.boot

最后,可以结合Boot的特性来实现面向自动重新加载代码的开发工作流。

C:\dev\my_project\build.boot

代码语言:javascript
复制
(set-env! :resource-paths #{"src"})

(require '[boot.core :as core]
         '[boot.pod  :as pod])

(deftask load-ns
  "Loads the my-project.utils namespace in a fresh pod."
  []
  (let [pods (pod/pod-pool (core/get-env))]
    (core/with-pre-wrap [fileset]
      (pod/with-eval-in (pods :refresh)
        ;; We require indirectly here so that errors from my-project.utils have
        ;; proper line and column information.
        (require 'my-project.load-impl))
      fileset)))

(deftask dev
  "Watches source code and loads my-project/utils every time code changes."
  []
  (comp (watch)
        (load-ns)))

C:\dev\my_project\src\my_project\load_impl.clj

代码语言:javascript
复制
(ns my-project.load-impl)

(require 'my-project.utils)

C:\dev\my_project\src\my_project\utils.clj

代码语言:javascript
复制
(ns my-project.utils
  (:require
    [clojure.string :as s]))

(defn my-range [start end]
  (take (- end start) (iterate inc start)))

(println "In the code!")
(println "(my-range 0 10) = " (my-range 10 20))

回到命令提示符处,键入boot dev。您应该看到一些println输出,每次编辑和保存文件时,您都应该再次看到它,反映您所做的任何更改。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33982533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档