使用Clojure core.typed强制命名空间重新加载

时间:2014-02-27 16:42:55

标签: emacs clojure clojure-core.typed

对于core.typed以及调用check-ns所需的方式,我可能真的不明白。

这是什么工作,然后什么不起作用:

  • lein new default showso
  • 使用Emacs
  • [org.clojure/core.typed "0.2.34"]依赖项添加到 project.clj
  • 修改 core.clj ,使其包含:

    (ns showso.core
      :require [clojure.core.typed :refer [ann check-ns AnyInteger]]))
    
    (ann somevar Number)
    (def somevar 42)
    
  • 苹果酒插孔式

  • REPL> (ns showso.core)
  • 苹果酒-EVAL-缓冲
  • showsho.core> (检查-NS)

    Initializing core.typed ...
    "Elapsed time: 2537.589357 msecs"
    core.typed initialized.
    Start collecting showso.core
    Finished collecting showso.core
    Collected 1 namespaces in 2595.464317 msecs
    Start checking showso.core
    Checked showso.core in 20.24605 msecs
    Checked 1 namespaces (approx. 5 lines) in 2619.38047 msecs
    :ok
    

所以到目前为止一切顺利,一切正常。

现在我真的根本没有得到的是,如果修改(def somevar 42),必须是Number,比如说String,那我根本就不能找到一种方法让check-ns函数考虑到这一变化:

(def somevar "bugsme")

现在,无论我尝试什么:cider-eval-buffer,cider-eval-last-expression,直接从repl重新定义somevar等等,显然我没做什么让check-ns接受考虑到了变化。

就好像上次check-ns的结果被缓存到某个地方而从未重新运行。

即使我杀死所有苹果酒Emacs缓冲液并重新启动苹果酒 - 插入,但仍未考虑更改。 check-ns一直告诉我一切正常。

我可以让check-ns考虑更改的唯一方法是完全关闭Emacs并重新启动它。

请注意,如果我首先使用虚假值进行测试,则完全相同:然后check-ns正确地找到类型不匹配(“Expected:java.lang.Number” ...)但是然后如果我修复它,除了重新启动Emacs以使check-ns报告没有错误之外别无他法。

我做错了什么?是否有一些先前值的缓存?

是否有一种简单的方法可以“强制”check-ns直接从Emacs中考虑更改,而无需启动新的REPL(在我的情况下甚至不够)/重新启动Emacs?

1 个答案:

答案 0 :(得分:4)

您应该在每次调用check-ns之前保存文件。