ELM (Programmiersprache)
![]() | |
Paradigma | Funktional |
---|---|
Entworfen von | Evan Czaplicki |
Erstmals erschienen | 30. März 2012[1] |
Stabile Version | 0.19.1 / 21. Oktober 2019[2] |
Disziplin tippen | Statisch, Stark, Gefolgert |
Lizenz | Permissive (Überarbeitete BSD)[3] |
Dateiname -Erweiterungen | .Ulme |
Webseite | Elm-Lang |
Beeinflusst von | |
Haskell, Standard ml, Ocaml, F# | |
Beeinflusst | |
Redux,[4] Vue[5] |
Ulme ist ein Domänenspezifische Programmiersprache zum deklarativ Erstellen Webbrowser-basierend Grafische Benutzeroberflächen. Elm ist rein funktionellund wird mit Schwerpunkt auf entwickelt Benutzerfreundlichkeit, Leistung und Robustheit. Es wirbt "nein Laufzeit Ausnahmen in der Praxis",[6] durch den Elm Compiler ermöglicht Statische Typprüfung.
Geschichte
Elm wurde zunächst 2012 von Evan Czaplicki als seine These entworfen.[7] Die erste Veröffentlichung von ELM wurde mit vielen Beispielen und einem Online -Redakteur geliefert, der es einfach machte, in einem auszuprobieren Webbrowser.[8] Evan schloss sich an Prezi im Jahr 2013, um an ELM zu arbeiten,[9] und im Jahr 2016 zog auf Noredink Als Open -Source -Ingenieur starten Sie auch die ELM Software Foundation.[10]
Die erste Implementierung der ELM -Compiler -Ziele Html, CSS, und JavaScript.[11] Der Satz der Kernwerkzeuge hat sich weiter erweitert, einschließlich a Wiederholung,[12] Paket-Manager,[13] zeitreisender Debugger,[14] und Installateure für MacOS und Windows.[15] Elm hat auch ein Ökosystem von Community erstellte Bibliotheken und Ellie, ein fortschrittlicher Online -Editor, der gespeicherte Arbeit und Aufnahme von Community -Bibliotheken ermöglicht.
Merkmale
ELM verfügt über eine kleine Reihe von Sprachkonstrukten, einschließlich herkömmlicher IF-Expressionen, Let-Expressionen für den lokalen Zustand und Fall-Expressionen für Musteranpassung.[16] Als funktionale Sprache unterstützt es Anonyme Funktionen, Funktionen als Argumente und Funktionen können Funktionen zurückgeben, wobei letztere häufig durch teilweise Anwendung von Curry -Funktionen. Funktionen werden von Wert bezeichnet. Seine Semantik umfasst unveränderliche Werte, Staatenlose Funktionenund statische Typisierung mit Typinferenz. ELM -Programme rendern HTML durch ein virtuelles DOM und können mit einem anderen Code mit "JavaScript als Dienst" zusammenarbeiten.
Unveränderlichkeit
Alle Werte in ELM sind unveränderlich, was bedeutet, dass ein Wert nach dem Erstellen nicht geändert werden kann. Elm verwendet anhaltende Datenstrukturen Um seine Arrays, Sätze und Wörterbücher in der Standardbibliothek zu implementieren.[17]
Statische Typen
ELM wird statisch getippt. Typ -Anmerkungen sind optional (aufgrund von Typinferenz), aber stark gefördert. In der Zeile über der Definition gibt es Anmerkungen (im Gegensatz zu C-Familiensprachen, in denen Typen und Namen durchsetzt). ELM verwendet einen einzelnen Dickdarm, um "Has Typ" zu bedeuten.
Zu den Typen gehören Primitive wie Ganzzahlen und Zeichenfolgen sowie grundlegende Datenstrukturen wie Listen, Tupel und Aufzeichnungen. Funktionen haben zum Beispiel mit Pfeilen geschriebene Typen Runde: Float -> int
. Benutzerdefinierte Typen Ermöglichen Sie dem Programmierer, benutzerdefinierte Typen zu erstellen, um Daten auf eine Weise darzustellen, die der Problemdomäne entspricht.[18]
Typen können sich auf andere Typen beziehen, zum Beispiel a Liste int
. Typen werden immer aktiviert; Kleinbuchstaben sind Typ Variablen. Zum Beispiel a Liste a
ist eine Liste von Werten eines unbekannten Typs. Es ist die Art der leeren Liste und des Arguments an Liste.Length
, was für die Elemente der Liste agnostisch ist. Es gibt einige spezielle Typen, die Programmierer erstellen, um mit der ULM -Laufzeit zu interagieren. Zum Beispiel, HTML MSG
repräsentiert einen (virtuellen) Dom -Baum, dessen Ereignishandler alle Nachrichten vom Typ erzeugen Nachricht
.
Anstatt einen Wert implizit nullbar zu lassen (ein solcher JavaScript nicht definiert
oder ein Null Zeiger), ELMs Standardbibliothek definiert a Vielleicht ein
Typ. Der Code, der einen optionalen Wert erzeugt oder behandelt, verwendet diese Art explizit, und allen anderen Code wird garantiert, dass tatsächlich ein Wert des geltenden Typs vorhanden ist.
ELM bietet eine begrenzte Anzahl von Einbauten Geben Sie Klassen ein: Nummer
welches beinhaltet Int
und Schweben
Erleichterung der Verwendung numerischer Operatoren wie z. (+)
oder (*)
, vergleichbar
die Zahlen, Zeichen, Zeichenfolgen, Listen vergleichbarer Dinge und Tupel vergleichbarer Dinge umfasst, um die Verwendung von Vergleichsbetreibern zu erleichtern, und anhangbar
die Zeichenfolgen und Listen umfasst, um die Verkettung mit (++)
. ELM bietet keinen Mechanismus, der benutzerdefinierte Typen in diese Typklassen einbezieht oder neue Typklassen erstellt (siehe Abschnitt "Einschränkungen).
Modulsystem
Elm hat a Modulsystem Dadurch können Benutzer ihren Code in kleinere Teile unterteilen, die als Module bezeichnet werden. Module können Implementierungsdetails wie Helferfunktionen ausblenden und gemeinsam gruppenbezogene Code zusammenstellen. Module dienen als Namespace für importierten Code, wie z. Bitweise und
. Bibliotheken (oder Pakete) von Drittanbietern bestehen aus einem oder mehreren Modulen und sind aus dem erhältlich Elm öffentliche Bibliothek. Alle Bibliotheken werden nach versioniert Semver, das vom Compiler und anderen Tools durchgesetzt wird. Das heißt, das Entfernen einer Funktion oder das Ändern ihres Typs kann nur in einer größeren Veröffentlichung erfolgen.
Interoperabilität mit HTML, CSS und JavaScript
ELM verwendet eine Abstraktion namens Ports, um mit der Kommunikation zu kommunizieren JavaScript.[19] Es ermöglicht es Werten, in ELM -Programmen und aus ELM -Programmen zu fließen, sodass es zwischen ELM und JavaScript kommunizieren kann.
ELM verfügt über eine Bibliothek namens ELM/HTML, mit der ein Programmierer HTML und CSS innerhalb von ELM schreiben kann.[20] Es verwendet eine virtuelle Dom Ansatz, um Aktualisierungen effizient zu machen.[21]
Backend
ELM unterstützt die serverseitige Entwicklung offiziell nicht. Das Kernentwicklungsteam betrachtet es nicht als ihr Hauptziel und fokussiert die Entwicklung auf die Verbesserung der Erfahrung in der Front-End-Entwicklung. Dennoch gibt es mehrere unabhängige Projekte, die versuchen, Möglichkeiten für die Verwendung von ELM für das Back-End zu untersuchen. Die Projekte stecken hauptsächlich auf der ELM -Version 0.18.0, da neuere "native" Code und einige andere verwendete Funktionen nicht unterstützen. Es gibt zwei Versuche, ELM mit Beam (Erlang Virtual Machine) zu verwenden. Eines der Projekte führt ELM direkt in der Umgebung aus[22] während ein anderer es mit Elixier zusammenstellt.[23] Es gab auch einen Versuch, ein Back-End-Framework für ELM zu schaffen, das von Node.js Infrastructure betrieben wurde.[24] Keines der Projekte ist produktionsbereit.
Die Elmarchitektur
Die ELM -Architektur ist ein Muster zum Erstellen interaktiver Webanwendungen. ELM -Anwendungen sind auf diese Weise natürlich konstruiert, aber andere Projekte können das Konzept nützlich finden.
Ein ELM -Programm ist immer in drei Teile aufgeteilt:
- Modell - Der Zustand der Anwendung
- Ansicht - Eine Funktion, die das Modell in HTML verwandelt
- Update - Eine Funktion, die das Modell basierend auf Nachrichten aktualisiert
Das sind der Kern der ELM -Architektur.
Stellen Sie sich beispielsweise eine Anwendung vor, die eine Nummer und eine Taste anzeigt, die die Zahl beim Drücken erhöht.[25] In diesem Fall müssen wir nur eine Nummer speichern, sodass unser Modell so einfach sein kann wie Typ alias modell = int
. Das Aussicht
Funktion würde mit dem definiert werden Html
Bibliothek und Zeigen Sie die Nummer und die Schaltfläche an. Damit die Nummer aktualisiert werden soll, müssen wir in der Lage sein, eine Nachricht an die zu senden aktualisieren
Funktion, die über einen benutzerdefinierten Typ wie z. Typ msg = erhöhen
. Das Zunahme
Der Wert wird an der in der definierten Taste angehängt Aussicht
Funktion so, dass wenn die Schaltfläche von einem Benutzer geklickt wird, Zunahme
wird an die weitergegeben aktualisieren
Funktion, die das Modell durch Erhöhen der Anzahl aktualisieren kann.
In der ELM -Architektur Senden Sie Nachrichten an aktualisieren
ist der einzige Weg, um den Zustand zu verändern. In ausgefeilteren Anwendungen können Nachrichten aus verschiedenen Quellen stammen: Benutzerinteraktion, Initialisierung des Modells, interne Aufrufe aus aktualisieren
, Abonnements für externe Ereignisse (Fenstergrößen, Systemuhr, JavaScript Interop ...) und URL -Änderungen und -anforderungen.
Einschränkungen
Elm unterstützt nicht Hochkörner Polymorphismus,[26] Welche verwandten Sprachen Haskell und Pureskript Angebot und auch nicht unterstützt die Schaffung von Geben Sie Klassen ein.
Dies bedeutet, dass ELM zum Beispiel keinen generischen hat Karte
Funktion, die über mehrere Datenstrukturen hinweg funktioniert, z. Aufführen
und Satz
. In ELM werden solche Funktionen normalerweise nach ihrem Modulnamen qualifiziert, z. B. Anrufe Liste.Map
und Set.map
. In Haskell oder Purescript würde es nur eine Funktion geben Karte
. Dies ist eine bekannte Feature -Anfrage, die seit mindestens 2015 auf Czaplickis raues Roadmap steht.[27]
Ein weiteres Ergebnis ist eine große Menge an Boilerplate -Code In mittleren bis großen Projekten, wie vom Autor von "Elm in Action" veranschaulicht[28] Mit fast identischen Fragmenten werden in Aktualisierung, Ansicht, Abonnements, Routen -Parsen und Baufunktionen wiederholt.
Beispielcode
- Dies ist ein einzelner Zeilenkommentar. {-- Dies ist ein Mehrzeilungskommentar. Es ist {- nestbar. -} -} - Hier definieren wir einen Wert namens "Gruß". Der Typ wird als "String" abgeleitet. Gruß = "Hallo Welt!" -Es ist am besten, Typanmerkungen zu Erklärungen auf höchstem Niveau hinzuzufügen. hallo : Saite hallo = "Hi." - Funktionen werden auf die gleiche Weise deklariert, wobei Argumente dem Funktionsnamen folgen. hinzufügen x y = x + y - Auch hier ist es am besten, Typanmerkungen hinzuzufügen. Hypotenuse : Schweben -> Schweben -> Schweben Hypotenuse a b = sqrt (a^2 + b^2) -Wir können Lambda -Funktionen mit der Syntax von `\ [arg] -> [Ausdruck]` erstellen. hallo : Saite -> Saite hallo = \s -> "Hi, " ++ s - Funktionserklärungen können die von "_` gekennzeichneten anonymen Parameternamen haben, die im Körper nicht verwendet werden. Const : a -> b -> a Const k _ = k - Funktionen sind ebenfalls Curry; Hier haben wir die Multiplikation umgehalten - Infix-Operator mit einem `2` Multiplyby2 : Nummer -> Nummer Multiplyby2 = (*) 2 -If-Expressions werden verwendet, um auf "bool`-Werten" zu verzweigen absoluter Wert : Nummer -> Nummer absoluter Wert Nummer = wenn Nummer < 0 dann negieren Nummer anders Nummer - Datensätze werden verwendet, um Werte mit den benannten Feldern zu halten Buchen : { Titel : Saite, Autor : Saite, Seiten : Int } Buchen = { Titel = "Steppenwolf" , Autor = "Hessen" , Seiten = 237 } - Aufzeichnungszugriff erfolgt mit "." Titel : Saite Titel = Buchen.Titel - Aufzeichnen Sie den Zugriff `.` kann auch als Funktion verwendet werden Autor : Saite Autor = .Autor Buchen - Wir können markierte Gewerkschaften mit dem Schlüsselwort "Typ" erstellen. - Der folgende Wert repräsentiert einen binären Baum. Typ Baum a = Leer | Knoten a (Baum a) (Baum a) -Es ist möglich, diese Typen mit Fallexpressionen zu inspizieren. Tiefe : Baum a -> Int Tiefe Baum = Fall Baum von Leer -> 0 Knoten _ links Rechts -> 1 + Max (Tiefe links) (Tiefe Rechts)
Siehe auch
- Pureskript: Eine stark typische, rein funktionierende Programmiersprache, die JavaScript kompiliert
- Grund: Eine Syntaxerweiterung und Toolchain für Ocaml das kann auch transpilieren nach JavaScript
Verweise
- ^ Czaplicki, Evan (30. März 2012). "Meine These ist endlich vollständig!" Elm: Concurrent FRP für funktionale GUIs "". Reddit.
- ^ "Releases · Elm/Compiler".
- ^ "Elm/Compiler". GitHub. 16. Oktober 2021.
- ^ "Prior Art - Redux". redux.js.org.
- ^ "Vergleich mit anderen Frameworks - Vue.js".
- ^ "Elm Homepage".
- ^ "ELM: Gleichzeitige FRP für funktionale GUIs" (PDF).
- ^ "Versuchen Sie es mit Elm". Elm-Lang.org. Archiviert von das Original Am 2017-05-21. Abgerufen 2019-07-24.
- ^ "Elm und Prezi". Elm-Lang.org.
- ^ "Neue Abenteuer für Elm". Elm-Lang.org.
- ^ "Elm/Compiler". GitHub. 16. Oktober 2021.
- ^ "Repl". Elm-Lang.org.
- ^ "Paket-Manager". Elm-Lang.org.
- ^ "Heim". Elm-Lang.org.
- ^ "Installieren". Guide.elm-Lang.org.
- ^ "Syntax". Elm-Lang.org. Archiviert von das Original Am 2016-03-13. Abgerufen 2013-05-31.
- ^ "Elm/Kern". package.elm-Lang.org.
- ^ "Modellieren Sie das Problem". Ulme. Abgerufen 4. Mai 2016.
- ^ "JavaScript Interop". Elm-Lang.org.
- ^ "Elm/HTML". package.elm-Lang.org.
- ^ "Fast html" lodering ". Elm-Lang.org.
- ^ "Kofigumbs/Elm-Beam". 24. September 2021.
- ^ "Was ist es?". 24. September 2021.
- ^ "Tafel". 18. September 2021.
- ^ "Buttons · Eine Einführung in Elm". Guide.elm-Lang.org. Abgerufen 2020-10-15.
- ^ "Höhere Kessentypen nicht ausdrucksfähig? #396". github.com/elm-lang/elm-compiler. Abgerufen 6. März 2015.
- ^ "Höhere Kessentypen, die nicht exprimierbar #396". github.com/elm-lang/elm-compiler. Abgerufen 19. November 2019.
- ^ "Main.elm". github.com/rtfeldman/elm-spa- example. Abgerufen 30. Juni 2020.