2015-11-06 3 views
6

Ich habe Ulme gesehen und ich genieße es wirklich, die Sprache zu lernen. Ich habe über eine Tabellenkalkulation nachgedacht, aber ich kann mir nicht vorstellen, wie es strukturiert sein würde.Wie würden Sie eine Tabellenkalkulations-App in Ulme strukturieren?

Sagen wir, wir haben drei Zellen; A, B und C. Wenn ich 4 in Zelle A und =A in Zelle B eingeben, wie würde ich Zelle B immer gleich Zelle A erhalten? Wenn ich dann in Zelle C =A+B eingeben, kann dies zu 8 ausgewertet werden, und auch aktualisiert werden, wenn A oder B ändert? Nicht sicher, wie Signale für ein solches dynamisches Verhalten Hebel. Grüße Oskar

Antwort

5

Zuerst müssen Sie entscheiden, wie Sie Ihre Tabelle Raster darstellen. Wenn Sie von einem C-Hintergrund kommen, möchten Sie vielleicht ein 2D-Array verwenden, aber ich habe festgestellt, dass ein Wörterbuch in Elm tatsächlich besser funktioniert. So können Sie type alias Grid a = Dict (Int, Int) a definieren.

Wie für die a, was jede Zelle enthält ... Dies ist eine Möglichkeit, eine domänenspezifische Sprache zu definieren. So etwas wie

type Expr = Lit Float | Ref (Int, Int) | Op2 (Float -> Float -> Float) Expr Expr 

Das bedeutet, ein Ausdruck ist entweder ein Literal-Float, ein Verweis auf einen anderen Zellstandort oder ein Operator. Ein Operator kann jede Funktion auf zwei Gleitkommazahlen und zwei andere Ausdrücke sein, die rekursiv ausgewertet werden. Je nachdem, für was Sie vorgehen, können Sie stattdessen spezifische Tags für jede Operation definieren, z. B. Plus Expr Expr | Times Expr Expr, oder Sie können zusätzliche opN-Tags für Operationen mit unterschiedlicher Priorität (wie Negieren) hinzufügen.

Also dann könnten Sie type alias Spreadsheet = Grid Expr definieren, und wenn Sie möchten, Alias ​​(Int, Int) etwas, das könnte auch helfen. Ich nehme auch an, dass Sie nur Floats in Ihrer Tabelle möchten.

Jetzt brauchen Sie Funktionen, um Strings in Ausdrücke und zurück zu konvertieren. Die traditionellen Namen für diese Funktionen sind parse und eval.

parse : String -> Maybe Expr -- Result can also work 
eval : Spreadsheet -> Grid Float 
evalOne : Expr -> Spreadsheet -> Maybe Float 

Parse wird ein wenig schwierig sein; Die String module ist dein Freund. Eval beinhaltet das Verfolgen von Referenzen durch die Tabelle und das rekursive Ausfüllen der Ergebnisse. Zunächst solltest du die Möglichkeit ignorieren, Endlosschleifen zu fangen. Dies ist nur eine Skizze. Wenn Sie feststellen, dass verschiedene Typ-Signaturen besser funktionieren, verwenden Sie sie.

Wie für die Ansicht, würde ich mit schreibgeschützt starten, damit Sie überprüfen können, hart-codierte Tabellenkalkulationen ordnungsgemäß ausgewertet werden. Dann können Sie sich über das Bearbeiten Gedanken machen, mit der Idee, dass Sie den Parser und den Evaluator einfach neu starten und eine neue Tabelle zum Rendern erhalten. Es sollte funktionieren, da eine Kalkulationstabelle keinen anderen Status als den Inhalt jeder Zelle hat. (Das Minimieren der neu berechneten Arbeit ist eine von vielen Möglichkeiten, die Sie erweitern können.) Wenn Sie elm-html verwenden, sollten Tabellenelemente in Ordnung sein.

Hoffe, dass dies dich in die richtige Richtung bringt. Dies ist ein ehrgeiziges Projekt und ich würde es gerne sehen, wenn du fertig bist (poste es auf mailing list). Viel Glück!

+0

Vielen Dank für Ihre sehr gründliche Antwort. Ich freue mich darauf, es auszuprobieren. Wird sicher stellen, wenn ich etwas nützliches erledigt bekomme :) – oskbor

Verwandte Themen