読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

Hart Dart Library 公開しました

Dart が公開されてから一ヶ月がたったのでそろそろサードパーティのライブラリが公開されてもいいころでしょう。
というわけで,Hart Dart Library を公開します。
sscrisk/Hart - GitHub
JavaScriptにコンパイル済みのデモもあるので Dart 処理系が無い方もダウンロードしてみてください。

Hart Dart Library とは

世界初かは知らないけどたぶん日本初の Dart 言語のライブラリです。
Haskell の Prelude(PreludeList) モジュールに含まれる関数群の Dart 移植で,Dart での関数型プログラミングを支援します。
Haskell におけるリストを Dart における Iterable インターフェースにマッピングしています。また各関数は基本一引数でどんどんバインドできます。
また遅延評価を特徴としていて,イテレータの next() または hasNext() が呼ばれるまでは評価されません。
使い方や仕様は hartTest.dart や Prelude,それにデモ (demo/demo.html) を見てください。
ここでは幾つか紹介します。

enumFrom(0) == [0, 1, 2..] 無限リスト
enumFromThen('a')('c') == ['a', 'c', 'e'..] 無限リスト
map((a) => 3 * a)([1, 2, 3, 4]) == [3, 6, 9, 12]
filter(odd)([0, 1, 2, 3, 4, 5]) == [1, 3, 5]
foldl((a) => (b) => a / b)(64)([4, 2, 4]) == 2
foldr1((x) => (y) => (x + y) / 2)([12, 4, 10, 6]) == 9
any(even)([1, 3, 5, 7, 9]) == false
scanl((x) => (y) => 2 * x + y)(4)([1, 2, 3]) == [4, 9, 20, 43]
iterate((a) => 2 * a)(1) == [1, 2, 4, 8, 16..] 無限リスト
repeat('A') == ['A', 'A'..] 無限リスト
cycle([1, 2, 3]) == [1, 2, 3, 1..] 無限リスト
take(2)([1, 2, 3, 4, 5]) == [1, 2]
dropWhile((a) => a < 3)([1, 2, 3, 4, 5]) == [3, 4, 5]
lines("aa\nbb\nbb") == ["aa", "bb", "bb"]

DOM もノードをリストとして扱うことが多く(element.childNodes など),このリストを Hart で扱うことができます。実例はデモ参照。