Ich schreibe einen Scheme-like in Interpreter. Es scheint natürlich, dass der Scheme-like-Interpreter gut mit jedem Objekt zusammenarbeiten sollte, das IEnumerable implementiert.Was ist der minimale Satz von Sequenz- "Primitiven", die für irgendwelche Sequenzberechnungen benötigt werden?
Der Interpreter lässt keine Mutation zu - keine Funktionen mit Nebenwirkungen sind offengelegt.
Da IEnumerable nicht klonbar ist (siehe here), kann ich die Iteration über die Liste nicht effizient mit Auto und Cdr implementieren.
Um jede "höhere Ordnung" Zeug effizient dann zu ermöglichen, musste ich einige Primitive als C# Builtins für den Interpreter implementieren.
Bisher habe ich die folgenden "Primitiven", wie C# eingebaute Funktionen implementiert:
- Filter
- Karte (die Karte vergrößern, nicht nur mapcar)
- foldr
Aber Ich vermute zum Beispiel, dass ich wahrscheinlich "Filter" mit einer Kombination aus Map und Foldr implementieren könnte.
Was ist die minimale Menge von Primitiven, die ich als "Butintins" bereitstellen müsste, damit ich andere Funktionen ohne IEnumerable-Instanzen ohne zusätzliche Laufzeit- oder Platzkosten implementieren kann, ohne eine Mutation einführen zu müssen?
Nur eine Beobachtung. Früher habe ich IEnumerable auch für Listen verwendet, aber sobald Sie unangemessene Listen benötigen, fällt die ganze Sache ab. Ich fand es besser, einfach eine Cons-Klasse zu erstellen und sie so zu verwenden, wie sie in Scheme verwendet wird. Dies bedeutet nicht, dass Ihre Cons nicht IEnumerable sein kann, verlassen Sie sich nicht darauf, dass es eine richtige Liste ist. – leppie
Enumerable kann schnell "geklont" werden. Verwenden Sie einfach select und übergeben Sie die Identity-Funktion für einen Selektor. – leppie