LINQと他言語のリスト処理ライブラリの対比(Scheme編)


2011年 11月 01日

問題

美しいプログラムを書く(リスト処理ライブラリ編)
では「ちょっとした数のデータを相手に何か処理を行う」(=リスト処理を行う)ことを例題に、
既存のライブラリを適切に使えばコードを簡潔かつ明瞭にできることを示しました。
一度コツを掴めば開発効率がどんどん向上します。

ところが、現実には複数の言語を並行して利用する機会は少なからずあります。
不慣れな言語でコードを書いていると
「あの言語でいうところのアレはこの言語でいうとどうなるんだろう」
と思うことが頻繁に発生します。
特にリスト処理については頻出しますから、
各言語での書き方の比較表が欲しいところです。
しかし探してみても案外見つかりません。

という訳で見つからないなら作ってしまいましょう。

前提

比較対照する言語は以下の通り:

比較表

LINQ のメソッド対応する Scheme の関数
Aggregatefold
Allevery
Any()null?
Any(predicate)any
AsEnumerablen/a (型付けの違いのため)
Average直接対応するものはない。
Castn/a (型付けの違いのため)
Concatappend (ただしこちらの方が引数の制限が緩い)
Containsmembermemvmemq
Countcount
DefaultIfEmpty直接対応するものはない。強いて書くなら: (if (null? xs) (list default-value) xs)
Distinct直接対応するものはない。強いて書くなら: (apply lset-adjoin = '() xs)
ElementAtlist-ref
ElementAtOrDefaultlist-ref (Gauche のみ)
Empty'() (ただし要素に対する型付けはない)
Exceptlset-difference
Firstfirst
FirstOrDefault直接対応するものはない。強いて書くなら: (if (null? xs) default-value (first xs))
GroupBygroup-collection (Gaucheのみ)
GroupJoin直接対応するものはない。
Intersectlset-intersection
Join直接対応するものはない。
Lastlast
LastOrDefault直接対応するものはない。強いて書くなら: (if (null? xs) default-value (last xs))
LongCountcount
Maxmax
Minmin
OfTypefilter + 型に関する述語
OrderBysort
OrderByDescendingsort
Rangeiota または list-ec (どちらも引数が若干異なる)
Repeatlist-tabulatecircular-list
Reversereverse
Selectmap
SelectManymap からの concatenate
SequenceEqual=
Single直接対応するものはない。
SingleOrDefault直接対応するものはない。
Skipdrop
SkipWhiledrop-while
Sum直接対応するものはない。強いて書くなら (apply + xs) あるいは (fold + 0 xs)
Taketake
TakeWhiletake-while
ThenBy直接対応するものはない。
ThenByDescending直接対応するものはない。
ToArraylist->vector
ToDictionary直接対応するものはない。強いて言えば alist->hash-table が近いが、キーの衝突に関する挙動が異なる。
ToList直接対応するものはない。強いて言えば list->vector が近いが、 Scheme の vector はサイズが不変。
ToLookup直接対応するものはない。
Unionlset-union
Wherefilter
Zipzip