Wir scheinen uns momentan an einem gewissen Totpunkt zu befinden, aber ich finde die Sachen, die wir schon haben, nicht schlecht. Ich hoffe, ihr habt nicht die Lust verloren. Ich will jedenfalls weitermachen.
Collections sind schwierig (ich habe mir z.B. http://www.youtube.com/watch?v=uiJycy6dFSQ angesehen, wo Paul Phillips mit Scalas Collections ins Gericht geht), und es bringt nichts, blind voranzustürmen (z.B. war mein Vorschlag, alles in ein map-artiges Framework zu packen, nicht unbedingt schlecht, aber in unserem Rahmen wohl zu exotisch, und ich werde ihn erst einmal nicht weiter verfolgen). Stattdessen sollten wir versuchen, uns auf das Wesentliche zu konzentrieren und jede Featuritis vermeiden.
Wie soll es nun weitergehen? Ich sehe zwei Hauptprobleme: Wie gehen wir mit Laziness/Strictness um, und wie abstrahieren wir unsere Collections?
Meine Meinung ist, dass immutable Collections ohne Laziness wenig nützlich sind, und dass das einfach der Standardfall werden sollte, zumal man ja leicht eine lazy Collection zu einer strikten machen kann. Ich weiß, dass das zu unerwarteten Ergebnissen führen kann, aber wenn alles, was an einer solchen Stelle nötig ist, ein “force”-Aufruf ist, finde ich das akzeptabel. Falls jemand eine bessere Idee hat, wie man Laziness und Strictness “nebeneinander” ausdrücken kann, bin ich dafür offen. Aber ich habe länger darüber nachgedacht und mir ist keine elegante Implementierung eingefallen.
Nun gibt es mehrer Arten, wie man Laziness implementieren kann. Ich favorisiere memoisierende Laziness (also wenn ein Element einmal ausgewertet wurde, ist es “bekannt” und findet keine erneute Berechnung statt). Als “Testballon” arbeite ich an einer Stream-Klasse (im funktionales Sinn, also eine Art unendliche einfach verkettete Liste), die ich zur Diskussion stellen möchte.
Ich denke, es ist auch für das Finden geeigneter Abstraktionen wichtig, nicht immer nur um NecoList zu kreisen, sondern auch andere Klassen als Beispiel zur Verfügung zu haben. Ich denke erst so werden einige Probleme der API deutlich (was ist z.B. mit size(), last(), init()?) Neben Stream würde ich eventuell noch einen einfachen immutablen Array-Wrapper schreiben, und vielleicht noch ein Set, oder hat von euch jemand Lust? Dann können wir anhand konkreter Beispiele über Abstraktionen diskutieren, ohne uns in Spekulationen zu verlieren.
Außerdem würde ich vorschlagen, perspektivisch doch auf GitHub umzuziehen. Es ist dumm, auf Feedback zu verzichten, nur weil Leute den Code nicht sehen können. Ich weiß, dass man Hemmungen hat, “unfertigen” Code zu zeigen, aber von außen wirkt das wie Geheimniskrämerei.