Clojure core.typed未报告repl中的类型错误
以下是取自core.typed github repo的部分示例:Clojure core.typed未报告repl中的类型错误,clojure,clojure-core.typed,Clojure,Clojure Core.typed,以下是取自core.typed github repo的部分示例: (ns typedclj.rps-async (:require [clojure.core.typed :as t] [clojure.core.async :as a] [clojure.core.typed.async :as ta])) (t/defalias Move "A legal move in rock-paper-scissors" (t/U ':
(ns typedclj.rps-async
(:require [clojure.core.typed :as t]
[clojure.core.async :as a]
[clojure.core.typed.async :as ta]))
(t/defalias Move
"A legal move in rock-paper-scissors"
(t/U ':rock ':paper ':scissors))
(t/defalias PlayerName
"A player's name in rock-paper-scissors"
t/Str)
(t/defalias PlayerMove
"A move in rock-paper-scissors. A Tuple of player name and move"
'[PlayerName Move])
(t/defalias RPSResult
"The result of a rock-paper-scissors match.
A 3 place vector of the two player moves, and the winner"
'[PlayerMove PlayerMove PlayerName])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(t/ann MOVES (t/Vec Move))
(def MOVES [:rock :paper :scissors])
(t/ann BEATS (t/Map Move Move))
(def BEATS {:rock :scissors, :paper :rock, :scissors :paper})
(def BEATS {:a :b})
注意,在最后一行中,我重新定义了BEATS to{:a:b},这与其类型注释冲突,但是当我在repl中求值时,不会抛出错误。我希望出现错误,因为最新版本的core.typed据说能够在运行时报告类型错误
以下是整个project.clj文件:
(defproject typedclj "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/core.async "0.1.346.0-17112a-alpha" :exclusions [org.clojure/tools.analyzer.jvm]]
[org.clojure/core.typed "0.2.92"]
[clj-http "1.1.2"]
[http-kit "2.1.18"]
]
:repl-options {:nrepl-middleware [clojure.core.typed.repl/wrap-clj-repl]}
:main ^:skip-aot typedclj.core
:target-path "target/%s"
:profiles {:uberjar {:aot :all}})
使用core.typed 0.3.0-alpha2,可以很好地捕获此类型错误:
Type Error (/private/var/folders/5d/44ctbbln4dsflgzxph1dm8wr0000gn/T/form-init3488589171262628870.clj:36:12) Type mismatch:
Expected: typedclj.rps-async/Move
Actual: (t/Val :b)
in: :b
Type Error (/Users/kaiyin/personal_config_bin_files/workspace/typedclj/src/typedclj/rps_async.clj:36:12) Type mismatch:
Expected: (t/Map typedclj.rps-async/Move typedclj.rps-async/Move)
Actual: (t/HMap :mandatory {:a typedclj.rps-async/Move} :complete? true)
in: {:a :b}
是的,当您明确要求它报告错误时,它会在运行时报告错误。这与静态类型语言略有不同,静态类型语言中的类型错误会阻止程序成功构建——这里只是可选的“健全性检查” 类型检查独立于编译,必须显式运行 使用
clojure.core.typed/check ns
键入检查当前命名空间。
这可以在REPL上完成
注意:像ann
这样的全局注释只有在
当前正在使用check ns
检查的命名空间,或用cf
包装的命名空间。
REPL中的原始ann
无效。全局注释应该是
顶级表单或位于(可能嵌套的)顶级do
中
-
在REPL中,您应该将表达式包装在
cf
中,以便从给定代码推断类型并打印出来。(请参阅)如果要从源文件中定义的命名空间键入检查代码,请使用check ns
对整个命名空间进行类型检查。您需要显式选择隐式类型检查。更改您的ns表单,如下所示:
(ns ^:core.typed typedclj.rps-async
...)
这是0.2.92之前的情况;OP正在测试新功能。@Ambrose的文档很难找到,或者根本不存在?CHANGELOG.md中有一些文档,否则没有。功能仍然是在制品。补充了这一点,但没有什么区别。您如何评估这些东西?您正在使用IDE吗?Lein REPL?谢谢,用草书做更多的测试。酷。期待您的下一个版本。继续做好工作!:-)试试core.0.3.0-alpha2。