ClojureScript

1.10.597 リリース

2019年11月18日
ClojureScript チーム

注目すべき変更点

  • set/unioninto の動作が Clojure と一致するようになりました。

  • subvec の引数チェックが Clojure と一致するようになりました。

  • 配列に対する apply vector が配列を適切に複製するようになりました。

Google Closure 名前空間分析

コンパイラは Google Closure 名前空間の分析メタデータを生成するようになりました。これは、これらの名前空間に対して

  • docdirapropos などの REPL 機能が動作するようになったことを意味します。

  • 引数リストが利用可能になり、アリティチェックが可能になりました。

  • 戻り値の型が利用可能になり、型推論が強化されました。

  • プライベート var の使用に関する警告が生成されるようになります。

例として、(require '[goog.crypt :as crypt]) を REPL で調べてみましょう。

(dir crypt) は、その名前空間にある関数を一覧表示します。

byteArrayToHex
byteArrayToString
hexToByteArray
...

docstring が利用可能です。(doc crypt/hexToByteArray) は以下を生成します。

-------------------------
goog.crypt/hexToByteArray
([hexString])
  /**
 * Converts a hex string into an integer array.
...

アリティ情報が利用可能です。関数のいずれかに正しくない引数の数が渡されると、アリティ警告が生成されます。たとえば、(crypt/hexToByteArray "abc" 123) は以下を生成します。

WARNING: Wrong number of args (2) passed to goog.crypt/hexToByteArray at line 1 <cljs repl>

型推論の改善

このリリースでは、ClojureScript の型推論にいくつかの改善が加えられています。

レコードのキーワード検索のための直接フィールドアクセス

これは、例を用いて簡単に説明できます。

(defrecord Complex [re im])

(let [x (->Complex 1.1 2.7)]
   (:re x))

最後の式のコードは x.re になります。これは 66% から 450% 高速になります。

文字列と配列の count 特殊化

count を文字列または配列であると静的に推論された値に適用すると、生成される JavaScript は、count のランタイム呼び出しではなく、length フィールドへの直接アクセスを伴います。

たとえば、(count "abc")"abc".length を出力します。コンテキストによっては、これは桁違いに高速になる可能性があります。

simple-* / qualified-* 述語による推論

ローカルに対して simple-keyword? または qualified-keyword? が満たされる場合、そのローカルはキーワードとして推論されます。同様に、simple-symbol? または qualified-symbol? は、ローカルをシンボルとして推論します。

これは本質的に、keyword?symbol? の既存の述語による推論を、これらの追加のコア述語に拡張します。

and を介した述語による推論のスレッド化

この型推論の改善は、例を用いて説明するのがおそらく最良でしょう。次のコードの場合、

(and (string? x) (zero? (count x)))

コンパイラは、上記の and の最初の句が満たされた場合、2 番目の句では x は文字列型である必要があることを認識するようになりました。上記の count 特殊化と組み合わせることで、効率的な JavaScript が生成されます。

typeof x === "string" && x.length === 0

implements? での推論を行わない

これは、標準ライブラリの内部的な、しかし重要な最適化です。implements? 述語がローカルで満たされると、コンパイラは、そのローカルを含む式に対してより効率的な関数ディスパッチコードを生成します。

不適切に拡張されたクロス パラメータ loop / recur 推論

loop / recur 拡張推論に関連するコーナーケースが修正されました。loop バウンド ローカルが recur ターゲットとして使用される場合、正しくない推論が発生する可能性があります。

動的変数は、型 any を持つものとして正しく推論されるようになりました

動的変数が初期値の型を持つものとして誤って推論される推論バグが修正されました。これは、動的変数は実行時に初期値の型とは異なる型の値で再バインドできるため、正しくありませんでした。

パフォーマンスの向上

IAssociative 値での assoc の最適化

コア assoc 関数の最適化により、IAssociative 値(一般的なケース)に assoc する場合の速度が向上しました。

たとえば、マップにキーと値を assoc する場合、V8 では 24%、JavaScript コアでは 11% 高速になり、この頻繁に使用されるコア関数のパフォーマンスが大幅に向上します。

ci-reducecollnot-native としてタグ付けする

これは、標準ライブラリに影響を与える重要な内部最適化であり、IIndexed および ICounted であるコレクションを削減する場合のパフォーマンスが向上します。

cljs.source-map.base64/encode のパフォーマンスの向上

これは、ソースマップの生成に頻繁に使用される関数の パフォーマンスを向上させ、測定の 1 つでパフォーマンスが 17% 向上しました。

変更リスト

ClojureScript 1.10.597 の更新の完全なリストについては、変更 を参照してください。

貢献者

ClojureScript 1.10.597 に貢献してくれたすべてのコミュニティメンバーに感謝します。

  • Dieter Komendera

  • Erik Assum

  • Herald

  • Martin Kavalar

  • Martin Kučera

  • Michiel Borkent

  • Roman Liutikov

  • Seçkin Kükrer

  • Thomas Mulvaney