私はインタプリタでSchemeのようなものを書いています。 Schemeのようなインタプリタは、IEnumerableを実装するオブジェクトでうまく動作するはずです。シーケンス計算に必要な最小限のシーケンス「プリミティブ」とは何ですか?
インタープリタは突然変異を許可していません。副作用のある関数は公開されていません。
IEnumerableは複製できないため(hereを参照)、carとcdrを使用して効率的にリストを反復処理することはできません。
"高次の"ものが効率的になるためには、インタプリタ用のC#ビルトインとしていくつかのプリミティブを実装しなければなりませんでした。
- フィルタ
- マップ(フルマップだけでmapcarない)
- foldr
しかし:
は、これまでのところ私はC#組み込み関数として、以下の "プリミティブ" を実施しています私は恐らく、おそらくmapとfoldrの組み合わせを使って "filter"を実装できると思う。
余分なランタイムやスペースのコストをかけずにIEnumerableインスタンス上で他の機能を実装できるように、そして組み込みを導入することなく、「組み込み関数」として公開する必要がある最小限のプリミティブは何ですか?
ただの観測です。私はIEnumerableをリストにも使用していましたが、不適切なリストが必要になるとすぐに、すべてがフラットになります。 Consクラスを作成し、Schemeで使用されているように使用するほうが良いことがわかりました。これはあなたの短所がIEnumerableになることはできないと言っているわけではなく、それが正しいリストであることに頼らないでください。 – leppie
列挙可能なものは高速に 'クローン化'できます。 selectを使ってセレクタのアイデンティティ関数を渡すだけです。 – leppie