在Clojure REPL中管理和查找变量

时间:2015-01-16 04:58:42

标签: clojure

我在看https://github.com/juxt/dirwatch图书馆。首页的例子是:

(require '[juxt.dirwatch :refer (watch-dir)])
(watch-dir println (clojure.java.io/file "/tmp"))

工作正常。假设上面的内容在REPL中执行:

user=> (watch-dir println (clojure.java.io/file "/tmp"))
#<Agent@16824c93: #<LinuxWatchService sun.nio.fs.LinuxWatchService@17ece9ac>>

现在,我有一个代理,当我修改/tmp中的文件时会打印事件:

{:file #<File /tmp/1>, :count 1, :action :modify}

所以一切都很好。

我知道我可以使用以前的表达式引用(*1*2*3)来引用代理。但是,如果没有重新启动REPL本身,我不知道如何:

  • 取消绑定这样创建的隐式var - 即如何完全删除绑定,以便代理获得GC并停止工作
  • 在我没有绑定它的情况下丢失它,如上所述,访问它。如果我没有弄错的话,在REPL中只有最后三个结果可用(*3,但是*4,而且还不是),至少每http://clojure.org/repl_and_main

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你看过代码了吗? watch-dir的文档包含:&#34;此函数返回的观察者是一个资源 应该用近观者关闭。&#34;

查看代码时,watch-dir使用send-off,其中&#34;向代理发送可能阻止的操作。立即返回代理。&#34;。换句话说,为了解决您的第一个问题,没有创建隐式var。如果你想要删除代理,你应该将返回的代理绑定到某个var,然后在其上调用close-watcher

要解决第二个问题,请查看规范documentation for agents。具体来说,您可以调用shutdown-agents,这将关闭线程池(也可能会杀死其他代理)。