“Conway’s Game Of Life” in Elixir
Andreas • • uncategorized
Die Programmiersprache “Erlang” ist in letzter Zeit wieder mehr im Gespräch, vor allem wenn es um Funktionale Programmierung geht. Die Syntax schreckte mich jedoch immer ab. Bei .Net Rocks hörte ich das erste Mal über die Programmiersprache Elixir, die auf der Erlang-VM ausgeführt wird. Die Besonderheit ist, dass die Syntax sehr stark an Ruby angelehnt ist und damit für viele verständlich sein sollte. Mit kleinen Ruby-Kenntnissen und ohne Erfahrung in Funktionaler Programmierung machte ich mit Sicherheit die schönsten Anfängerfehler. Hier eine Zusammenfassung meiner Eindrücke.
Rekursion und Schleifen
In allen mir bekannten Programmiersprachen gibt es Schleifen. In Elixir gibt es jedoch nur Funktionen die als Schleife genutzt werden können oder die Möglichkeit der Rekursion. Damit hatte ich nicht gerechnet und dieser Umstand hat mir sicher einen Abende an Nachforschungen gekostet. Die Macher der Programmiersprache haben jedoch an uns Programmierer gedacht und ein eigenes Getting-Startet Kapitel für Rekursionen gemacht in dem die Verwendung sehr gut erklärt wird.
Zustand und Agents
Für dieses Aufgabe wäre es nicht notwendig gewesen den Zustand des Spielbrettes extra zu Verwalten, aber da es hier um den Weg und nicht das Ziel ging durfte diese Funktion aus dem Erlang OTP-Package nicht fehlen.
Die Implementierung war äußerst einfach. Das Agentmodul verfügt eigentlich nur über drei wichtige Funktionen:
- start_link zum Starten des Prozesses, der Prozess kann zur weiteren Verwendung mit einem Namen verknüpft werden. In meinem Beispiel
__MODULE__ ist ein Platzhalter für den umschließenden ModulnameAgent.start_link(fn –> Board.create_board(length,height) end,
name: __MODULE__)
- get liefert den aktuellen Wert, es kann eine Funktion entgegen nehmen. Meistens wird eine Funktion aus einem Modul übergeben.
- update damit kann der Wert innerhalb der Daten verändert werden.
Patternmatching und IF-Statement
Patternmatching war für mich bis jetzt ein Begriff der stark mit Voodoo verknüpft war. Seit den ersten Gehversuchen hat sich diese Technik jedoch als sehr vielseitig und nützlich erwiesen. Im Detail heißt das, ich konnte das Programmierbeispiel komplett ohne ein einziges IF-Statement erstellen. Die Stärke liegt dabei auf der Einbindung in die Methodensignatur, so sind einzelne IF-Zweige als zwei unterschiedliche Methoden realisierbar.
Das Beispiel zeigt die Prüfung auf leere oder befüllte Liste mit Aufteilung auf erstes und letzten Elemente.
def x([head|tail]) do … end
def x([]) do … end
Gesamteindruck
Der Gesamteindruck war durchwegs positiv. Die Dokumentation ist gut und alle Bereiche sind gut erklärt. Die Stabilität der Sprache konnte ich mit diesem Beispiel nicht wirklich testen, es traten jedoch keine Überraschungen auf. Durch die Verwendung der Erlang-VM sind hier auch keine Überraschungen zu erwarten. Die einzigen Fragezeichen in meinem Kopf entstanden durch die Vermischung von Abhängigkeiten aus Git-Repositories und dem Hex-Packagemanager. Die Fehlermeldungen und die Dokumentation brachte mich auch hier schnell ans Ziel.
Hilfreiche Links:
- Git Projekte im Zusammenhang mit Elixir
- Getting Started Beispielprojekt
- Meine Implementierung