ClojureScript pre和post条件的高级编译
ClojureScript advanced compilation of pre and post conditions
我在 ClojureScript 项目中有以下代码:
(ns project.lib
(:require [cljs.test :refer-macros [is]]))
(defn my-fn [p]
{:pre [(is (#{:allowed-key :another-allowed-key} p))]}
;;...
)
我想知道我是否可以控制 :pre
和 :post
断言的行为,一般来说,确保不包含一些与参数检查相关的代码的方法是什么.
注意 :我知道 :closure-define
编译器选项,但不确定如何将其应用于此特定情况。
您可以将编译器选项 :elide-asserts
设置为 true
以消除所有断言,包括 :pre
和 :post
断言。
此标志独立于 :advanced
,即使在该模式下也需要设置以消除生产代码中的断言。
见https://github.com/clojure/clojurescript/wiki/Compiler-Options#elide-asserts
另请注意,一般来说,cljs.test
命名空间只会在单元测试命名空间中使用,它会被放置在一个单独的目录中(可能在 "test"
下而不是 "src"
) 并且,如果使用 lein
,您将使用 :source-paths
以便不在您的生产构建中包含测试。
话虽如此,在生产代码中使用 :pre
和 :post
完全没问题——只需使用 "regular" 谓词而不是 cljs.test
is
宏.对于您的具体示例,is
可以被删除,因为前提条件只需要评估为真实的东西。
我在 ClojureScript 项目中有以下代码:
(ns project.lib
(:require [cljs.test :refer-macros [is]]))
(defn my-fn [p]
{:pre [(is (#{:allowed-key :another-allowed-key} p))]}
;;...
)
我想知道我是否可以控制 :pre
和 :post
断言的行为,一般来说,确保不包含一些与参数检查相关的代码的方法是什么.
注意 :我知道 :closure-define
编译器选项,但不确定如何将其应用于此特定情况。
您可以将编译器选项 :elide-asserts
设置为 true
以消除所有断言,包括 :pre
和 :post
断言。
此标志独立于 :advanced
,即使在该模式下也需要设置以消除生产代码中的断言。
见https://github.com/clojure/clojurescript/wiki/Compiler-Options#elide-asserts
另请注意,一般来说,cljs.test
命名空间只会在单元测试命名空间中使用,它会被放置在一个单独的目录中(可能在 "test"
下而不是 "src"
) 并且,如果使用 lein
,您将使用 :source-paths
以便不在您的生产构建中包含测试。
话虽如此,在生产代码中使用 :pre
和 :post
完全没问题——只需使用 "regular" 谓词而不是 cljs.test
is
宏.对于您的具体示例,is
可以被删除,因为前提条件只需要评估为真实的东西。