(if (string? x)
(inc x)
10)
2019年1月31日
ClojureScript チーム
Spec instrumentation (cljs.spec.test.alpha/instrument および関連機能) は、test.check を必要としなくなりました。 cljs.spec.test.alpha/check を使用する場合は、test.check のデータ生成機能が必要になります。その場合は、clojure.test.check と clojure.test.check.properties 名前空間を require する必要があります。
Spec での test.check の使用に関する cljs.spec.test.alpha/check API で使用されるキーワードは、Clojure と一致するように clojure.spec.test.check で修飾されるようになりました。 clojure.test.check で修飾する以前の方法は引き続きサポートされています。
Clojure 1.10 で追加された改善された例外基盤は、このリリースで ClojureScript に移植されました。
このリリースでは、cljs.reader に機能を委任する新しい clojure.edn 名前空間が追加されました。これにより、clojure.edn/read と clojure.edn/read-string を使用するポータブルな Clojure / ClojureScript ソースの記述が容易になります。
型推論アルゴリズムは、条件式で使用されるローカルの型を推論する際に、コア述語を考慮するようになりました。
例えば、
(if (string? x)
(inc x)
10)
x が string? を満たすため、then ブランチでは文字列型として推論されます (そのため、inc が適用されているため警告が出力されます)。
cond と when は if の上に構築されたマクロであるため、述語による推論は cond と when を含む式でも期待どおりに機能します。
コア述語に加えて、述語による型推論は instance? チェックでも機能します。したがって、たとえば (instance? Atom x) をテストすると、x は cljs.core/Atom 型として推論されます。
値が nil になる可能性がある場合 (型タグではシンボル clj-nil で表される)、そのような値を参照する単純なシンボルが条件のテストとして使用されると、型推論アルゴリズムは then ブランチでは値が nil になることはないと推論します。
これは、例を用いて説明するのがおそらく最善です。次の関数があるとします
(defn f [x]
(when (even? x)
(inc x)))
この関数の戻り値の型は #{number clj-nil} で、数値または nil が返されることを意味します。
f を使用し、以前は #{number clj-nil} を返すものとして推論されていた次の関数は、 अब `number` を返すものとして推論されます.
(defn g [y]
(let [z (f y)]
(if z
z
17)))
実際、or マクロの展開方法により、式 (or (f 1) 17) は単に number として推論されるようになりました。
loop / recur 推論の改善型推論アルゴリズムは、loop ローカル型を推論する際に recur パラメーター型を考慮するようになりました。
例えば、
(loop [x "a"]
(if (= "a" x)
(recur 1)
(+ 3 x)))
ローカル x は以前は文字列型として推論されていました (そして、これはそれを 3 に加算する式に対して警告が出力される原因となっていました). 今では、コンパイラは x を文字列または数値のいずれかとして推論します (そのため、警告は表示されなくなります)。
ClojureScript 1.10.439 では関数の戻り値の型推論が追加されましたが、この機能は単一アリティ関数に対してのみ機能しました。このリリースでは、この機能が多重アリティ関数と可変長引数関数に拡張されます.
さらに、異なるアリティが異なる型を返す場合、推論される戻り値の型は適切に変化します。例えば、
(defn foo
([x] 1)
([x y] "a"))
式 (foo true) は数値型として推論され、(foo :a :b) は文字列型として推論されます。
このリリースには、Spec 実装のいくつかの改善が含まれており、標準コアライブラリで関数を spec すること、およびコードベース内の多数の関数が spec を持つ場合の instrumentation パフォーマンスを向上させることが容易になります.
ClojureScript 1.10.516 の更新の完全なリストについては、変更点を参照してください。