Rei*_*ica 5 workflow clojure read-eval-print-loop
我的一个基于Clojure的项目使用netty(aleph所需)web服务器.我在这样的web.clj文件中启动服务器以及其他组件:
(ns myproject.web)
(def server (atom nil))
(defn initialize []
(if @server
(println "Warning: already initialized")
(let [port 8001]
(println (format "Starting http://localhost:%s/" port))
(swap! server (fn [_] (start-http-server
(wrap-ring-handler app-routes)
{:port port}))))))
(defn shutdown []
(when @server
(do
(println "Shutting down web server")
(@server)
(swap! server (fn [_] nil)))))
(defn reinitialize []
"Run this on the REPL to reload web.clj and restart the web server"
(myproject.web/shutdown)
(use :reload-all 'myproject.web)
(myproject.web/initialize))
Run Code Online (Sandbox Code Playgroud)
服务器实例存储在Clojure 原子中,以便以后可以停止.
我使用Emacs和斯旺克直接发动对REPL这样的服务器(编译后web.clj用C-c C-k):
user> (myproject.web/initialize)
Run Code Online (Sandbox Code Playgroud)
无论何时web.clj编辑或其他相关模块,我都必须
记住不要web.clj使用Cc Ck 重新编译,因为持有运行实例的原子会从REPL中消失(由于来自新编译模块的原子).
运行(myproject.web/reinitialize),停止服务器,然后重新加载模块再次启动它.
这有两个问题:
通常我会忘记#1点然后再按C-c C-k.这导致REPL中服务器原子丢失,导致必须杀死swank(或重启emacs),以便我可以在相同的端口号启动服务器.
:reload-all不会将编译错误报告为友好的C-c C-k(丑陋的回溯与简明的可点击错误).
如何在编辑 - 编译 - 重启工作流程中最好地解决这两个问题?
你可以替换
(def server (atom nil))
Run Code Online (Sandbox Code Playgroud)
同
(defonce server (atom nil))
Run Code Online (Sandbox Code Playgroud)
这样,当您评估缓冲区时,它将不会重新定义服务器.
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |