{"id":8005,"date":"2021-07-11T17:06:59","date_gmt":"2021-07-11T15:06:59","guid":{"rendered":"http:\/\/blog.via-internet.de\/?p=8005"},"modified":"2021-07-27T19:06:11","modified_gmt":"2021-07-27T17:06:11","slug":"elixis-getting-started","status":"publish","type":"post","link":"https:\/\/via-internet.de\/blog\/2021\/07\/11\/elixis-getting-started\/","title":{"rendered":"Elixir | Einstieg in Elixir"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Einf\u00fchrung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><a rel=\"noreferrer noopener\" href=\"https:\/\/elixir-lang.org\/\" data-type=\"URL\" data-id=\"https:\/\/elixir-lang.org\/\" target=\"_blank\">Elixir<\/a> ist eine dynamische, funktionale Sprache zum Erstellen skalierbarer und wartbarer Anwendungen. Elixir nutzt die <a href=\"https:\/\/www.erlang.org\/\" data-type=\"URL\" data-id=\"https:\/\/www.erlang.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Erlang <\/a>VM, die daf\u00fcr bekannt ist, verteilte und fehlertolerante Systeme mit geringer Latenz auszuf\u00fchren. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Au\u00dferdem wird Elixir wird erfolgreich in Webentwicklung, eingebetteter Software, Datenaufnahme und Multimediaverarbeitung in einer Vielzahl von Branchen eingesetzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier ein erster Blick:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex> \"Elixir\" |> String.graphemes() |> Enum.frequencies()\n\n\n\n\n<p class=\"wp-block-paragraph\">Oder, wie es <a href=\"https:\/\/de.wikipedia.org\/wiki\/Elixir_(Programmiersprache)\" data-type=\"URL\" data-id=\"https:\/\/de.wikipedia.org\/wiki\/Elixir_(Programmiersprache)\" target=\"_blank\" rel=\"noreferrer noopener\">Wikipedia <\/a>beschreibt:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>Elixir<\/strong>&nbsp;ist eine&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Funktionale_Programmierung\">funktionale<\/a>,&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Nebenl%C3%A4ufigkeit\">nebenl\u00e4ufige<\/a>&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Allzweck-Programmiersprache\">Allzweck-Programmiersprache<\/a>, die auf der&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Virtuelle_Maschine\">virtuellen Maschine<\/a>&nbsp;von&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Erlang_(Programmiersprache)\">Erlang<\/a>&nbsp;(BEAM) l\u00e4uft. <\/p><p>Es lassen sich damit verteilte,&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Fehlertoleranz\">fehlertolerante<\/a>, in&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Echtzeitsystem\">weicher Echtzeit<\/a>&nbsp;sowie permanent durchlaufende Programme erstellen. <\/p><p>Dar\u00fcber hinaus kann Elixir&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Metaprogrammierung\">Metaprogrammierung<\/a>&nbsp;mittels&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Makro\">Makros<\/a>&nbsp;und&nbsp;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Polymorphie_(Programmierung)\">Polymorphismus<\/a>&nbsp;mittels Protokollen abbilden.<sup><a href=\"https:\/\/de.wikipedia.org\/wiki\/Elixir_(Programmiersprache)#cite_note-4\">[<\/a><\/sup><\/p><\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading\">Elixir Grundlagen<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Hier folge eine kleine Einf\u00fchrung in die Programmiersprache Elixir <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Grundlegende Datentypen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Elixir supports the basic data types that other programming languages have. You can use&nbsp;<strong>integers<\/strong>&nbsp;(whole numbers),&nbsp;<strong>floats<\/strong>&nbsp;(decimal numbers),&nbsp;<strong>booleans<\/strong>&nbsp;(<code>true<\/code>&nbsp;or&nbsp;<code>false<\/code>) and&nbsp;<strong>strings&nbsp;<\/strong>(which are wrapped in double quotes, are UTF-8 encoded, and support line breaks).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Probieren wir in der Elixit Shell einfach die nachfolgenden Beispiele aus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Starten Sie dazu die Elixit Shell:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Oder wenn Sie mit Powershell arbeiten<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex.bat<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\"><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(1)> 5\n5\n\niex(2)> 4.32\n4.32\n\niex(3)> true\ntrue\n\niex(4)> \"Hello World!\"\n\"Hello World!\"\n\niex(5)> \"Hello\n...(5)> World!\"\n\"Hello\\nWorld!\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Beachten Sie, dass wir im letzten Beispiel Umschalt + Eingabetaste verwenden, um einen Befehl auszuf\u00fchren, der sich \u00fcber mehrere Zeilen erstreckt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie k\u00f6nnen auch Variablen und einfache Operatoren verwenden, um Werte zu vergleichen oder Zeichenfolgen zu verketten:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(1)> my_number = 6\n6\n\niex(2)> my_number\n6\n\niex(3)> my_number >= 7\nfalse\n\niex(4)> my_number == 6\ntrue\n\niex(5)> my_name = \"Tristan\"\n\"Tristan\"\n\niex(6)> \"Hello \" &lt;> my_name\n\"Hello Tristan\"\n\niex(7)> \"Hello #{my_name}\"\n\"Hello Tristan\"<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">\u200b<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Atoms<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Atome sind eine besondere Art von Datentyp, die Konstanten (unver\u00e4nderlichen Variablen) \u00e4hneln, ihr einziger Wert jedoch der ihnen gegebene Name ist.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(1)> :my_atom\n:my_atom\n\niex(2)> :my_atom == \"my_atom\"\nfalse\n\niex(3)> :my_atom == true\nfalse\n\niex(4)> :my_atom == :my_atom\ntrue\n\niex(5)> :my_other_atom = 4\n** (MatchError) no match of right hand side value: 4<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im letzten Beispiel sehen wir, dass wir einem Atom keinen bestimmten Wert zuweisen k\u00f6nnen. Auch hier ist ihr einziger Wert ihr Name!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lists<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Listen in Elixir k\u00f6nnen jeden Datentyp enthalten und beliebig lang sein. Sie k\u00f6nnen mit ++ zwei Listen verketten oder mit &#8212; eine Liste von einer anderen subtrahieren.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(1)> [5, \"Elixir\", :ok]\n[5, \"Elixir\", :ok]\niex(2)> [1, 2] ++ [3]\n[1, 2, 3]\niex(3)> [1, 2, 3] -- [2]\n[1, 3]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Beachten Sie, dass Elixir eine unver\u00e4nderliche Sprache (<strong>immutable language<\/strong>) ist. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn Sie diese Vorg\u00e4nge ausf\u00fchren, wird die urspr\u00fcngliche Liste also nie ge\u00e4ndert. Stattdessen wird eine neue Liste zur\u00fcckgegeben, die Sie in einer Variablen speichern k\u00f6nnen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(1)> my_list = [1, 2, 3]\n[1, 2, 3]\n\niex(2)> my_list ++ [4]\n[1, 2, 3, 4]\n\niex(3)> my_list\n[1, 2, 3]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Listen in Elixir k\u00f6nnen auch in zwei Teile aufgeteilt werden: den Kopf (<strong>head<\/strong>, der mit der hd-Funktion extrahiert werden kann) und den Schwanz (<strong>tail&nbsp;<\/strong>, der mit der tl-Funktion extrahiert werden kann). Der Kopf ist das erste Element der Liste und der Schwanz ist der Rest:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(1)> hd [5, \"Banana\", :ok]\n5\n\niex(2)> tl [5, \"Banana\", :ok]\n[\"Banana\", :ok]<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Tuples<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tupel \u00e4hneln Listen, aber sie speichern ihre Elemente zusammenh\u00e4ngend im Speicher. Dadurch wird der Zugriff auf Tupelelemente schneller als auf Listenelemente, jedoch ist deren \u00c4nderung langsamer. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie k\u00f6nnen ein Tupel als eine Ansammlung von Werten sehen, um eine Art Ressource zu bilden, w\u00e4hrend Listen verwendet werden, um Dinge aufzuz\u00e4hlen.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(7)> {\"Tristan\", 24}\n{\"Tristan\", 24}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sie werden feststellen, dass viele Elixir-Funktionen Tupel zur\u00fcckgeben, um zwischen Erfolgen und Misserfolgen zu unterscheiden, z.&nbsp;B.:&nbsp;<code>{:ok, value}<\/code>&nbsp;oder&nbsp;<code>{:error, error_message}<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Maps<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Karten (<strong>Maps<\/strong>) sind der Schl\u00fcsselwertspeicher (<strong>key-value store<\/strong>) von Elixir. Die Schl\u00fcssel k\u00f6nnen einen beliebigen Typ haben und zeigen mit <strong>=&gt;<\/strong> auf einen Wert.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(1)> company_phones = \n\n\niex(2)> company_phones.apple\n\"iphone\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Most of the time, you&#8217;ll probably want the keys in your map to be atoms, like in the example above. When that&#8217;s the case, there&#8217;s a nice shorthand syntax where we can use a colon instead of &#8220;<code>=&gt;<\/code>&#8221; to point to the values, and omit the&nbsp;<code>:<\/code>-character at the beginning of our atoms:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">iex(3)&gt; company_phones = \n\n\n\n<pre class=\"wp-block-preformatted\">\n\n\n\n<h2 class=\"wp-block-heading\">Structs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Struktur (<strong>struct<\/strong>) ist einer Map sehr \u00e4hnlich, bietet jedoch einige zus\u00e4tzliche Funktionen \u2013 Sie k\u00f6nnen die Anzahl der Schl\u00fcssel begrenzen und ihnen Standardwerte zuweisen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um Strukturen (<strong>structs<\/strong>) auszuprobieren, m\u00fcssen wir eine Elixir-Datei erstellen, also fahren Sie fort und erstellen Sie eine neue Datei namens user.ex. Darin werden wir ein neues Modul definieren, in dem wir auch unsere Struktur definieren:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">defmodule User do\n  defstruct name: \"Tristan\", age: 24\nend<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gehen Sie nun zur\u00fcck zur IEx-Shell und f\u00fchren Sie den Befehl c(&#8220;user.ex&#8221;) aus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie k\u00f6nnen jetzt eine neue Benutzerstruktur erstellen, indem Sie \n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f iex.bat -S mix\nCompiling 1 file (.ex)\nInteractive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)\niex(1)> c(\"user.ex\")\n[User]\niex(2)> \n\niex(3)><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conditionals<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die grundlegenden if- und else-Anweisungen funktionieren genau so, wie Sie es erwarten. Beachten Sie, dass wir end verwenden m\u00fcssen, um anzugeben, wo die if-Anweisungen enden.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(4)> if 5 > 4 do\n...(4)>   \"It's higher!\"\n...(4)> else\n...(4)>   \"It's lower\"\n...(4)> end\n\"It's higher!\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sie k\u00f6nnen sogar die Umkehrung  <code>unless<\/code> verwenden, um Ihren Code lesbarer zu machen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(6)> unless 5 > 6 do\n...(6)>   \"The laws of mathematics still work!\"\n...(6)> end\n\"The laws of mathematics still work!\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Was ist mit &#8220;else if&#8221;?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Elixir gibt es kein &#8220;else if&#8221;. Wenn Sie einen Flow mit mehr als nur zwei Ergebnissen haben, sollten Sie stattdessen wahrscheinlich cond verwenden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(5)> cond do\n...(5)>   5 > 6 ->\n...(5)>     \"This isn't true\"\n...(5)>   5 == 8 ->\n...(5)>     \"Neither is this\"\n...(5)>   true ->\n...(5)>     \"But this is!\"\n...(5)> end\n\"But this is!\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn in Ihrer cond-Anweisung nichts als wahr ausgewertet wird, wird eine Ausnahme ausgel\u00f6st! Daher ist es normalerweise eine gute Praxis, immer eine letzte true-Bedingung ganz am Ende Ihrer Anweisung hinzuzuf\u00fcgen (wie wir es in unserem obigen Beispiel getan haben), um eventuelle Ausnahmen zu behandeln.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schlie\u00dflich gibt es noch eine case-Anweisung, die den Kontrollfluss in Elixir behandelt, aber dazu werden wir im n\u00e4chsten Kapitel mehr erfahren \u2026<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Erstellen einer App<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Im ersten Schritt erstellen wir die grundlegende Elixir Anwendung mit Hilfe des Komandos <code data-enlighter-language=\"generic\" class=\"EnlighterJSRAW\">mix<\/code>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f mix new starterapp\n* creating README.md\n* creating .formatter.exs\n* creating .gitignore\n* creating mix.exs\n* creating lib\n* creating lib\/starterapp.ex\n* creating test\n* creating test\/test_helper.exs\n* creating test\/starterapp_test.exs\n\nYour Mix project was created successfully.\nYou can use \"mix\" to compile it, test it, and more:\n\n    cd starterapp\n    mix test\n\nRun \"mix help\" for more commands.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Durch dieses Kommando wird der Ordner <code data-enlighter-language=\"generic\" class=\"EnlighterJSRAW\">starterapp <\/code>mit der folgenbden Verzeichnisstruktur erstellt<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img decoding=\"async\" src=\"http:\/\/blog.via-internet.de\/wp-content\/uploads\/2021\/07\/image-5-700x410.png\" alt=\"\" class=\"wp-image-8006\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Ersten Test starten<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f cd starterapp<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f mix test\nCompiling 1 file (.ex)\nGenerated starterapp app\n..\n\nFinished in 0.07 seconds (0.00s async, 0.07s sync)\n1 doctest, 1 test, 0 failures\n\nRandomized with seed 697266<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ersten Programmcode schreiben<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Funktion say_hello<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">defmodule StarterApp do\n\n  def hello do\n    :world\n  end\n\n  def say_hello do\n    IO.puts(\"Hello World\")\n  end\n  \nend<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Interactive Shell mit unserer App starten<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex -S mix<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Unter Poweshell gibt es bereits einen Alias <code data-enlighter-language=\"generic\" class=\"EnlighterJSRAW\">iex<\/code>. Hier nutzen wir diesen Aufruf<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex.bat -S mix<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f iex.bat -S mix\nCompiling 1 file (.ex)\nGenerated starterapp app\nInteractive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)\niex(1)><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aufruf unserer Funktion<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f iex.bat -S mix\nCompiling 1 file (.ex)\nGenerated starterapp app\nInteractive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)\niex(1)> StarterApp.say(\"Hello\", \"World\")\nHello World!\n:ok\niex(2)><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Erweitern der Funktion um Paramter<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  def say(greeting, name) do\n    IO.puts \"#{greeting} #{name}!\"\n  end<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f iex.bat -S mix\nCompiling 1 file (.ex)\nGenerated starterapp app\nInteractive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)\niex(1)> StarterApp.say(\"Hello\", \"World\")\nHello World!\n:ok\niex(2)><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Funktion mit mehrerer, auch optionalen Parametern festlegen<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">defmodule StarterApp do\n\n  def main() do\n    name = IO.gets(\"Bitte geben Sie Ihrem Name an: \") |> String.trim\n    say(name)\n  end\n\n  def say(\"\") do\n    IO.puts \"Sie muessen einen Namen angeben!\"\n    main()\n  end\n\n  def say(name) do\n    IO.puts \"Hallo #{name}!\"\n  end\n\n  def say(greeting, name) do\n    IO.puts \"#{greeting} #{name}!\"\n  end\nend<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In der Elixir Shell das Modul neu laden<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(2)> r StarterApp\nwarning: redefining module StarterApp (current version defined in memory)\n  lib\/starterapp.ex:1\n\n{:reloaded, StarterApp, [StarterApp]}\niex(3)><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> Aufruf ohne Parameter<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(3)> StarterApp.say()\n** (UndefinedFunctionError) function StarterApp.say\/0 is undefined or private. Did you mean one of:\n\n      * say\/1\n      * say\/2\n\n    (starterapp 0.1.0) StarterApp.say()\niex(4)><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(4)> StarterApp.say(\"\")\nSie muessen einen Namen angeben!\nBitte geben Sie Ihrem Name an: World\nHallo World!\n:ok\niex(5)><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aufruf mit zwei Parametern<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">iex(8)>  StarterApp.say(\"Hallo\", \"Welt\")\nHallo Welt!\n:ok\niex(5)><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung Elixir ist eine dynamische, funktionale Sprache zum Erstellen skalierbarer und wartbarer Anwendungen. Elixir nutzt die Erlang VM, die daf\u00fcr bekannt ist, verteilte und fehlertolerante Systeme mit geringer Latenz auszuf\u00fchren. Au\u00dferdem wird Elixir wird erfolgreich in Webentwicklung, eingebetteter Software, Datenaufnahme und Multimediaverarbeitung in einer Vielzahl von Branchen eingesetzt. Hier ein erster Blick: Oder, wie es Wikipedia beschreibt: Elixir&nbsp;ist eine&nbsp;funktionale,&nbsp;nebenl\u00e4ufige&nbsp;Allzweck-Programmiersprache, die auf der&nbsp;virtuellen Maschine&nbsp;von&nbsp;Erlang&nbsp;(BEAM) l\u00e4uft. Es lassen sich damit verteilte,&nbsp;fehlertolerante, in&nbsp;weicher Echtzeit&nbsp;sowie permanent durchlaufende Programme erstellen. Dar\u00fcber hinaus kann Elixir&nbsp;Metaprogrammierung&nbsp;mittels&nbsp;Makros&nbsp;und&nbsp;Polymorphismus&nbsp;mittels Protokollen abbilden.[ Elixir Grundlagen Hier folge eine kleine Einf\u00fchrung in die Programmiersprache Elixir Grundlegende Datentypen Elixir supports the basic data types that [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":8092,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[94,24],"tags":[],"class_list":["post-8005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elixir","category-erlang"],"jetpack_featured_media_url":"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2021\/07\/Elixir-Einstieg-in-Elixir.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/8005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/comments?post=8005"}],"version-history":[{"count":1,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/8005\/revisions"}],"predecessor-version":[{"id":8095,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/8005\/revisions\/8095"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media\/8092"}],"wp:attachment":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media?parent=8005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/categories?post=8005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/tags?post=8005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}