byteArrayToHex byteArrayToString hexToByteArray ...
2019年11月18日
ClojureScript チーム
set/union と into の動作が Clojure と一致するようになりました。
subvec の引数チェックが Clojure と一致するようになりました。
配列に対する apply vector が配列を適切に複製するようになりました。
コンパイラは Google Closure 名前空間の分析メタデータを生成するようになりました。これは、これらの名前空間に対して
doc、dir、apropos などの 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? 述語がローカルで満たされると、コンパイラは、そのローカルを含む式に対してより効率的な関数ディスパッチコードを生成します。
IAssociative 値での assoc の最適化コア assoc 関数の最適化により、IAssociative 値(一般的なケース)に assoc する場合の速度が向上しました。
たとえば、マップにキーと値を assoc する場合、V8 では 24%、JavaScript コアでは 11% 高速になり、この頻繁に使用されるコア関数のパフォーマンスが大幅に向上します。
ClojureScript 1.10.597 の更新の完全なリストについては、変更 を参照してください。