(ns foo.core)
(defn- some-impl [x]
(inc x))
2018年11月2日
ClojureScript チーム
Closure Compiler が v20180805 にアップグレードされました。
:npm-deps コンパイラオプションのデフォルト値が false になりました。以前は、:npm-deps のデフォルト値は true でした。
通常のビルドと :parallel-build が true に設定されている場合の両方で、コンパイラは 1.10.339 リリースと比較して znacznie高速になりました。
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")
cljs.core.truth_ を使用して big? の戻り値をブール値に強制する防御的な JavaScript を出力していました
(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 に型ヒントがない場合、コンパイラは number ではなく any 型を示す警告を出力していました。
ClojureScript には、Graal.JS REPL 環境が付属するようになりました。これは、既存の Nashorn REPL 環境に似た新しい Java ベースの REPL 環境ですが、GraalVM の一部として提供される新しい Graal.JS JavaScript エンジンを使用します。
Graal.JS REPL 環境は、インストールされている可能性のある他の言語への Polyglot 呼び出しを許可するように 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
Polyglot サポートに加えて、Graal.JS エンジンは Nashorn よりもはるかに高速であり、他の主要な JavaScript エンジンのパフォーマンスに近づいています。特にウォームアップされ、JVM がホットスポットを最適化する機会を得た後は高速です。
GraalVM はまだリリースされておらず、変更される可能性があるため、この新しい REPL 環境はベータ版と見なす必要があります。ぜひお試しください!
内部 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 とその支援メンバーに感謝します!
詳細は以下を参照してください