首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >core.typed中没有报告类型错误

core.typed中没有报告类型错误
EN

Stack Overflow用户
提问于 2015-05-22 07:29:51
回答 2查看 88关注 0票数 4

下面是取自core.typed github的示例的一部分:

代码语言:javascript
复制
(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})

请注意,在最后一行中,我将拍子重新定义为{:a :b},这与其类型注释发生冲突,但当我在repl中使用此值时,不会引发错误。我期待一个错误,因为core.typed的最新版本据说能够在运行时报告类型错误。

下面是整个project.clj文件:

代码语言:javascript
复制
            (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-alpha 2,这种类型的错误可以很好地捕捉到:

代码语言:javascript
复制
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}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-23 05:09:26

您需要显式选择隐式类型检查。将ns格式更改如下:

代码语言:javascript
复制
(ns ^:core.typed typedclj.rps-async
   ...)
票数 2
EN

Stack Overflow用户

发布于 2015-05-22 15:36:13

是的,当您明确要求它这样做时,它会在运行时报告错误。这与静态类型化语言略有不同,在静态类型化语言中,类型错误会阻止程序成功构建--这里只是一个可选的“正常检查”。

类型检查与编译是分开的,必须显式运行。 使用clojure.core.typed/check-ns键入检查当前命名空间。这可以在REPL中完成。 注意:像ann这样的全局注释只有在当前使用check-ns检查的名称空间中或包装在cf中时才有效。REPL中的原始ann没有任何效果。全局注释应该是顶级表单或(可能是嵌套的)顶级do中的注释。 - 快速指南

在REPL中,您应该用cf包装表达式,以便从给定的代码推断类型并打印出来。(请参见这篇博客文章)如果要从源文件中定义的名称空间中键入检查代码,请使用check-ns键入-检查整个命名空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30390817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档