ClojureScript

1.10.439 版本

2018 年 11 月 2 日
ClojureScript 团队

值得注意的变更

Closure Compiler 升级至 v20180805。

:npm-deps 编译选项现在默认值为 false。之前,:npm-deps 默认值为 true

编译器性能提升

与 1.10.339 版本相比,编译器在常规构建和 :parallel-build 设置为 true 时都更快了。

私有变量使用警告

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 的警告。

Graal.JS REPL 环境

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 环境应被视为测试版。我们鼓励您尝试一下!

Spec 更新

此版本包含对 Spec 的许多更新,将对 Clojure 实现的 Spec 所做的更改和修复带到了 ClojureScript 中。

AST 表示更新

内部 AST 表示已更新以匹配 tools.analyzer。这将简化处理 ClojureScript 生成的 AST 的工具。

变更列表

有关 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 及其支持成员为此次发布中的大量工作提供资金!

有关详细信息,请参阅