2014-02-27 89 views
2

可能有些事情我真的不明白core.typed和您需要调用check-ns的方式。使用Clojure强制命名空间重载core.typed

这里是什么工作,然后有什么不工作:

  • 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>(检查纳秒)

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

现在,不管我怎么努力:苹果酒-EVAL-缓冲,苹果酒-EVAL-最后表达,直接从REPL重新定义somevar等明显没有我这样做使得check-ns采取改变考虑到。

就好像上一次check-ns的结果被缓存在某处并且从不重新运行。

即使我杀死所有苹果酒Emacs缓冲区并重新启动苹果酒插孔,这些更改仍未考虑在内。检查ns一直告诉我一切正常。

我可以让check-ns把变化考虑进去的唯一方法是完全关闭Emacs并重新启动它。

请注意,这是完全一样的,如果我有一个假值第一次测试:再检查-NS正确查找类型不匹配(“预期:java.lang.Number中” ...),但是,如果我解决它除了重新启动Emacs以使check-ns报告没有错误之外,没有办法。

我在做什么错?是否有缓存的前值?

是否有一种简单的方法可以直接从Emacs中强制检查ns,而不必启动新的REPL(在我的情况下甚至不足)或重新启动Emacs?

回答

4

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