(ns foo.core)
(defn- some-impl [x]
(inc x))
2018 年 11 月 2 日
ClojureScript 团队
ClojureScript 现在会对私有变量的使用发出警告。
假设您有一个打算在命名空间中私下使用的函数
(ns foo.core)
(defn- some-impl [x]
(inc x))
并且您不小心从其他命名空间中使用了它,例如
(ns bar.core
(:require [foo.core]))
(foo.core/some-impl 3)
编译器现在会发出有用的诊断信息
WARNING: var: foo.core/some-impl is not public
这只是一个警告;ClojureScript 编译器仍然允许使用私有变量,但现在会发出一个新的分析警告,可以通过 :private-var-access
控制。
如果使用变量间接引用,则不会发出警告
(#'foo.core/some-impl 3)
ClojureScript 现在推断函数返回值类型,并将此信息传播到调用位置。
考虑这些谓词
(defn finite? [x]
(not (infinite? x)))
(defn big? [x]
(and (pos? x)
(finite? x)))
之前,以下代码
(if (big? 11)
"hi"
"bye")
会发出防御性的 JavaScript 代码,使用 cljs.core.truth_
将 big?
的返回值强制转换为布尔值
(cljs.core.truth_(cljs.user.big_QMARK_.call(null,(11)))?"hi":"bye")
现在,编译器会推断出 finite?
始终返回布尔值,因此 big?
也始终返回布尔值,并发出更有效的代码
((cljs.user.big_QMARK_.call(null,(11)))?"hi":"bye")
有了这种推断,不再需要在性能关键代码中手动添加 ^boolean
类型提示到谓词,只要可以从谓词函数主体推断返回值类型。
一般来说,任何推断出的类型都会自动从函数主体向外流动,例如以下示例中推断出的数值类型
(defn foo [x]
(+ x 3))
如果 foo
用于类型检查的上下文中,例如
(+ (foo 1) "a")
您现在会看到一个正确反映类型的警告
WARNING: cljs.core/+, all arguments must be numbers, got [number string] instead
之前,如果没有在 foo
上添加类型提示,编译器会发出一个表示类型为 any
而不是 number
的警告。
ClojureScript 现在附带了 Graal.JS REPL 环境。这是一个新的基于 Java 的 REPL 环境,与现有的 Nashorn REPL 环境类似,但使用的是新的 Graal.JS JavaScript 引擎,它作为 GraalVM 的一部分提供。
Graal.JS REPL 环境会自动配置 Graal.JS 引擎,以允许对可能已安装的其他语言进行多语言调用。
如果您在路径中有 GraalVM 版本的 Java,要使用 cljs.main
使用此新的 REPL 环境,只需指定 --repl-env graaljs
$ clj -M --main cljs.main --repl-env graaljs --repl
ClojureScript 1.10.439
cljs.user=> (.eval js/Polyglot "R" "sum(1:100)")
5050
cljs.user=> (.eval js/Polyglot "ruby" "(1..100).reduce(:+)")
5050
除了多语言支持外,Graal.JS 引擎比 Nashorn 快得多,在预热后接近其他领先的 JavaScript 引擎的性能,尤其是在 JVM 有机会优化热点时。
由于 GraalVM 尚未发布,并且可能还会发生变化,因此此新的 REPL 环境应被视为测试版。我们鼓励您尝试一下!
有关 ClojureScript 1.10.439 中所有更新的完整列表,请参阅 更改。
感谢所有为 ClojureScript 1.10.439 做出贡献的社区成员
Ambrose Bonnaire-Sergeant
Erik Assum
Eugene Kostenko
Henry Widd
Jordan Biserkov
Juho Teperi
Mike Fikes
Oliver Eidel
Ray McDermott
Thomas Spellman
感谢 Clojurists Together 及其支持成员为此次发布中的大量工作提供资金!
有关详细信息,请参阅