<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muzhawir Amri</title>
    <description>The latest articles on DEV Community by Muzhawir Amri (@muzhawir).</description>
    <link>https://dev.to/muzhawir</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F105626%2Fa41bfb26-a1b7-4a23-92ad-c4fc8723fd6c.jpg</url>
      <title>DEV Community: Muzhawir Amri</title>
      <link>https://dev.to/muzhawir</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muzhawir"/>
    <language>en</language>
    <item>
      <title>Variable, Immutability, And Garbage Collection</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 23 Jul 2025 18:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/variable-immutability-and-garbage-collection-ef2</link>
      <guid>https://dev.to/muzhawir/variable-immutability-and-garbage-collection-ef2</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;
Binding - Creating Variables

&lt;ul&gt;
&lt;li&gt;In Imperative Languages: A Refillable Box&lt;/li&gt;
&lt;li&gt;In Elixir: A Sealed Box&lt;/li&gt;
&lt;li&gt;Type Inference&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Naming Variables

&lt;ul&gt;
&lt;li&gt;Trailing Question Mark and Exclamation Mark&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Rebinding - Updating Variable Values&lt;/li&gt;

&lt;li&gt;Memory Management in Elixir&lt;/li&gt;

&lt;li&gt;References&lt;/li&gt;

&lt;/ul&gt;



&lt;h2&gt;
  
  
  Binding - Creating Variables
&lt;/h2&gt;

&lt;p&gt;In Elixir, we can give a name to a value just like in most programming languages. The syntax may look familiar, but under the surface, the idea of a “variable” works quite differently from how it does in languages like Python or JavaScript.&lt;/p&gt;

&lt;p&gt;First, let’s take a quick look at how variable assignment works in an imperative language like Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  In Imperative Languages: A Refillable Box
&lt;/h3&gt;

&lt;p&gt;Here is a typical Python example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can imagine &lt;code&gt;monthly_salary&lt;/code&gt; as a box with a label. First, the box holds &lt;code&gt;1000&lt;/code&gt;. Then, we open the box and replace its contents with &lt;code&gt;1500&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The box itself stays the same, but the value inside it changes. This is called &lt;strong&gt;mutability&lt;/strong&gt;, which means a value can be updated after it has been created. This is common in imperative languages, where programs are written as a series of steps that change the state of the system over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  In Elixir: A Sealed Box
&lt;/h3&gt;

&lt;p&gt;Now let’s see how Elixir handles the same idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This might look like the Python example at first glance, but under the hood, it behaves very differently.&lt;/p&gt;

&lt;p&gt;Let’s use the box analogy again. In Elixir, we are creating the value &lt;code&gt;1000&lt;/code&gt;, putting it into a box, sealing the box shut, and attaching the label &lt;code&gt;monthly_salary&lt;/code&gt; to it. Once the box is sealed, its contents cannot be changed.&lt;/p&gt;

&lt;p&gt;This concept is called &lt;strong&gt;immutability&lt;/strong&gt;. A value, once created, cannot be modified.&lt;/p&gt;

&lt;p&gt;Here are a few simple expressions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="mi"&gt;1000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt;
&lt;span class="mi"&gt;1000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="mi"&gt;12000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So far, everything is working as expected. But what if we try to “change” the value?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, this looks like we’re changing the value of &lt;code&gt;monthly_salary&lt;/code&gt;. But actually, we are not.&lt;/p&gt;

&lt;p&gt;We are not opening the original sealed box and changing what's inside. Instead, Elixir creates a new sealed box containing &lt;code&gt;1500&lt;/code&gt;. Then, it detaches the label &lt;code&gt;monthly_salary&lt;/code&gt; from the old box and attaches it to the new one.&lt;/p&gt;

&lt;p&gt;The label stays the same, but it now points to a different box. The old box still exists, but since it no longer has a label attached to it, it's considered unused.&lt;/p&gt;

&lt;p&gt;This is a fundamental idea in functional programming: values never change. If we need a different value, we create a new one and rebind the name.&lt;/p&gt;

&lt;p&gt;When an old value is no longer referenced by any name, Elixir will automatically clean it up. We will talk more about that in the memory management section.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type Inference
&lt;/h3&gt;

&lt;p&gt;Since Elixir is a dynamically typed language, it figures out the type of a value automatically based on what we assign to it. We do not need to specify the type manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;   &lt;span class="c1"&gt;# string&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;         &lt;span class="c1"&gt;# integer&lt;/span&gt;
&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.72&lt;/span&gt;    &lt;span class="c1"&gt;# float&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even though we don't write the types, Elixir keeps track of them internally and uses them correctly at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Naming Variables
&lt;/h2&gt;

&lt;p&gt;In Elixir, variable names must start with a lowercase letter (&lt;code&gt;a&lt;/code&gt; to &lt;code&gt;z&lt;/code&gt;) or an underscore (&lt;code&gt;_&lt;/code&gt;). After the first character, the name can contain letters, digits (&lt;code&gt;0&lt;/code&gt; to &lt;code&gt;9&lt;/code&gt;), or additional underscores. Underscores are commonly used to separate words for readability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Valid variable names:&lt;/span&gt;
&lt;span class="n"&gt;valid_variable_name&lt;/span&gt;
&lt;span class="n"&gt;also_valid_1&lt;/span&gt;
&lt;span class="n"&gt;validButNotRecommended&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variable names that start with uppercase letters are not allowed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Invalid:&lt;/span&gt;
&lt;span class="no"&gt;VariableName&lt;/span&gt;  &lt;span class="c1"&gt;# error: capital letter at the beginning&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trailing Question Mark and Exclamation Mark
&lt;/h3&gt;

&lt;p&gt;Elixir allows variable names to end with a question mark (&lt;code&gt;?&lt;/code&gt;) or an exclamation mark (&lt;code&gt;!&lt;/code&gt;). These characters do not affect how the code runs. They are just conventions that give extra meaning to the name.&lt;/p&gt;

&lt;p&gt;A question mark usually means the variable holds a boolean value or the result of a logical check. FOr examples: &lt;code&gt;valid?&lt;/code&gt;, &lt;code&gt;empty?&lt;/code&gt;, &lt;code&gt;active?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;An exclamation mark often means the value is guaranteed to exist, or that it came from a function that may raise an error if something goes wrong. For example, we might name a variable &lt;code&gt;data!&lt;/code&gt; to show that it comes from &lt;code&gt;File.read!/1&lt;/code&gt;, which will crash if the file cannot be read:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;user_valid?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;processed_data!&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"config.exs"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are not required to use these suffixes, but following these conventions makes our code easier to understand. This is especially helpful when working on large projects or with a team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rebinding - Updating Variable Values
&lt;/h2&gt;

&lt;p&gt;As we have seen, Elixir values are immutable. This means we cannot change them once they are created. But we can rebind the same name to a new value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are not modifying the existing value. We are creating a new one, and then binding the name &lt;code&gt;monthly_salary&lt;/code&gt; to this new value.&lt;/p&gt;

&lt;p&gt;Rebinding simply updates the association between the name and a different value. The original value still exists in memory, but it is no longer connected to that name.&lt;/p&gt;

&lt;p&gt;Here’s a full example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;   &lt;span class="err"&gt;❶&lt;/span&gt;
&lt;span class="mi"&gt;1000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt;               &lt;span class="err"&gt;❷&lt;/span&gt;
&lt;span class="mi"&gt;1000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1234&lt;/span&gt;   &lt;span class="err"&gt;❸&lt;/span&gt;
&lt;span class="mi"&gt;1234&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt;               &lt;span class="err"&gt;❹&lt;/span&gt;
&lt;span class="mi"&gt;1234&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ The name &lt;code&gt;monthly_salary&lt;/code&gt; is first bound to &lt;code&gt;1000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❷ When we check its value, it still points to &lt;code&gt;1000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❸ We rebind the same name to &lt;code&gt;1234&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❹ Now, &lt;code&gt;monthly_salary&lt;/code&gt; refers to the new value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The old value (&lt;code&gt;1000&lt;/code&gt;) is no longer in use. Elixir will eventually remove it from memory when it is no longer needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory Management in Elixir
&lt;/h2&gt;

&lt;p&gt;Elixir includes a garbage collector (GC), which is part of the runtime system. Its job is to find data that is no longer being used and free the memory it occupies.&lt;/p&gt;

&lt;p&gt;Let’s take another look at rebinding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1234&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the second line, the name &lt;code&gt;monthly_salary&lt;/code&gt; now refers to &lt;code&gt;2000&lt;/code&gt;. The earlier value &lt;code&gt;1234&lt;/code&gt; is no longer referenced by any name. At this point, Elixir considers it unused and will automatically clean it up.&lt;/p&gt;

&lt;p&gt;This entire process happens behind the scenes. You do not need to manually allocate or release memory. The runtime handles it for you, so you can focus on writing the logic of your program without worrying about memory leaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Saša Jurić. (2024). &lt;em&gt;Elixir In Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
    </item>
    <item>
      <title>Variabel, Imutabilitas, dan Garbage Collection</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 16 Jul 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/variabel-imutabilitas-dan-garbage-collection-1083</link>
      <guid>https://dev.to/muzhawir/variabel-imutabilitas-dan-garbage-collection-1083</guid>
      <description>&lt;h2&gt;
  
  
  Daftar Isi
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Binding&lt;/em&gt; - Membuat Variabel

&lt;ul&gt;
&lt;li&gt;Di Bahasa Imperatif - Kotak yang Dapat Diisi Ulang&lt;/li&gt;
&lt;li&gt;Di Elixir - Kotak Tersegel&lt;/li&gt;
&lt;li&gt;Tipe Data Ditentukan Otomatis&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Penamaan Variabel

&lt;ul&gt;
&lt;li&gt;Akhiran Tanda Tanya dan Tanda Seru&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;em&gt;Rebinding&lt;/em&gt; - Memperbarui Nilai Variabel&lt;/li&gt;

&lt;li&gt;Manajemen Memori di Elixir&lt;/li&gt;

&lt;li&gt;Referensi&lt;/li&gt;

&lt;/ul&gt;






&lt;p&gt;Di Elixir, data bersifat tetap, setelah dibuat nilainya tidak bisa diubah. Jika kita menulis ulang sebuah variabel, Elixir tidak mengganti nilai lama, tetapi membuat nilai baru dan mengaitkan nama yang sama ke nilai tersebut. Cara kerja ini disebut &lt;em&gt;immutability&lt;/em&gt;. Dalam pelajaran ini kita akan mempelajari bagaimana &lt;em&gt;immutability&lt;/em&gt; diterapkan melalui &lt;em&gt;binding&lt;/em&gt;, cara menamai variabel dengan benar, konsep &lt;em&gt;rebinding&lt;/em&gt;, serta bagaimana &lt;em&gt;garbage collector&lt;/em&gt; di BEAM mengelola memori agar program tetap efisien dan berjalan lancar.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Binding&lt;/em&gt; - Membuat Variabel
&lt;/h2&gt;

&lt;p&gt;Membuat &lt;em&gt;variable&lt;/em&gt; di Elixir sekilas tampak mirip dengan bahasa pemrograman imperatif seperti Ruby atau Python, tetapi cara Elixir memperlakukan nilai berbeda secara mendasar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Di Bahasa Imperatif - Kotak yang Dapat Diisi Ulang
&lt;/h3&gt;

&lt;p&gt;Dalam bahasa seperti Ruby, &lt;em&gt;variable&lt;/em&gt; bersifat &lt;em&gt;mutable&lt;/em&gt; (dapat diubah):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5_000_000&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5000000&lt;/span&gt;

&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;002&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6_000_000&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita dapat membayangkan &lt;em&gt;variable&lt;/em&gt; &lt;code&gt;monthly_salary&lt;/code&gt; sebagai &lt;strong&gt;kotak bernama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pertama, kotak itu diisi dengan nilai &lt;code&gt;5_000_000&lt;/code&gt;. Ketika nilainya diperbarui menjadi &lt;code&gt;6_000_000&lt;/code&gt;, isi kotak yang sama diganti. Kotaknya tetap sama, tetapi isinya berubah.&lt;/p&gt;

&lt;p&gt;Sifat ini disebut &lt;em&gt;mutable&lt;/em&gt;, artinya data dapat dimodifikasi setelah dibuat.&lt;/p&gt;

&lt;p&gt;Secara teknis, &lt;em&gt;variable&lt;/em&gt; dalam bahasa imperatif menunjuk ke &lt;strong&gt;lokasi memori tetap&lt;/strong&gt;, dan nilai di lokasi tersebut dapat diganti kapan saja. Perubahan ini dianggap sebagai “pembaruan nilai”.&lt;/p&gt;

&lt;h3&gt;
  
  
  Di Elixir - Kotak Tersegel
&lt;/h3&gt;

&lt;p&gt;Sekilas, sintaks pembuatan &lt;em&gt;variable&lt;/em&gt; di Elixir terlihat serupa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5_000_000&lt;/span&gt;
&lt;span class="mi"&gt;5000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Namun konsep di baliknya sangat berbeda.&lt;/p&gt;

&lt;p&gt;Kita dapat membayangkan nilai &lt;code&gt;5_000_000&lt;/code&gt; ditempatkan di dalam &lt;strong&gt;kotak tersegel&lt;/strong&gt;, lalu diberi label &lt;code&gt;monthly_salary&lt;/code&gt;. Karena kotaknya tersegel, isinya tidak dapat diubah. Sifat ini disebut &lt;em&gt;immutable&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Jika kita menulis ulang &lt;code&gt;monthly_salary&lt;/code&gt; dengan nilai baru:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6_000_000&lt;/span&gt;
&lt;span class="mi"&gt;6000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elixir tidak membuka kotak lama dan mengganti isinya. Ia membuat &lt;strong&gt;kotak baru&lt;/strong&gt; yang berisi &lt;code&gt;6_000_000&lt;/code&gt;, lalu &lt;strong&gt;memindahkan label nama&lt;/strong&gt; &lt;code&gt;monthly_salary&lt;/code&gt; ke kotak baru tersebut. Kotak lama tetap ada hingga sistem &lt;em&gt;garbage collector&lt;/em&gt; menghapusnya ketika sudah tidak digunakan.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Binding&lt;/em&gt; di Elixir bukan hubungan antara nama dan lokasi memori yang bisa dimodifikasi, melainkan antara &lt;strong&gt;nama dan nilai&lt;/strong&gt;. Nama hanyalah label yang menunjuk pada suatu nilai, bukan wadah yang menyimpannya.&lt;/p&gt;

&lt;p&gt;Kita dapat mengamati perilaku ini langsung di IEx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5_000_000&lt;/span&gt;
&lt;span class="mi"&gt;5000000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt;
&lt;span class="mi"&gt;5000000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="mi"&gt;60000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nilai aslinya tetap sama. Ketika kita melakukan &lt;em&gt;binding&lt;/em&gt; baru untuk &lt;code&gt;monthly_salary&lt;/code&gt;, Elixir tidak mengubah nilai lama, melainkan membentuk asosiasi baru antara nama dan nilai yang baru.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipe Data Ditentukan Otomatis
&lt;/h3&gt;

&lt;p&gt;Elixir adalah bahasa dinamis, artinya tipe data ditentukan otomatis berdasarkan nilai yang diberikan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;   &lt;span class="c1"&gt;# string&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;         &lt;span class="c1"&gt;# integer&lt;/span&gt;
&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.72&lt;/span&gt;    &lt;span class="c1"&gt;# float&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita tidak perlu menentukan tipe data secara eksplisit karena &lt;em&gt;runtime&lt;/em&gt; Elixir mengenali tipe setiap nilai secara otomatis. Pendekatan ini membuat kode lebih ringkas dan fleksibel tanpa mengorbankan kejelasan logika.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penamaan Variabel
&lt;/h2&gt;

&lt;p&gt;Penamaan &lt;em&gt;variable&lt;/em&gt; di Elixir mengikuti aturan sederhana namun penting untuk menjaga kejelasan kode. Nama harus diawali dengan huruf kecil (&lt;code&gt;a&lt;/code&gt;-&lt;code&gt;z&lt;/code&gt;) atau garis bawah (&lt;code&gt;_&lt;/code&gt;). Setelah karakter pertama, kita dapat menambahkan huruf, angka (&lt;code&gt;0&lt;/code&gt;-&lt;code&gt;9&lt;/code&gt;), atau garis bawah tambahan. Garis bawah biasanya digunakan untuk memisahkan kata dalam nama &lt;em&gt;variable&lt;/em&gt; sebagai pengganti spasi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Contoh nama variable valid&lt;/span&gt;
&lt;span class="n"&gt;valid_variable_name&lt;/span&gt;
&lt;span class="n"&gt;also_valid_1&lt;/span&gt;

&lt;span class="n"&gt;validButNotRecommended&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Huruf kapital di awal &lt;strong&gt;tidak diperbolehkan&lt;/strong&gt; untuk nama &lt;em&gt;variable&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Contoh tidak valid&lt;/span&gt;
&lt;span class="no"&gt;VariableName&lt;/span&gt;  &lt;span class="c1"&gt;# error: huruf kapital di awal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dalam Elixir, huruf kapital di awal nama digunakan secara khusus untuk &lt;em&gt;module&lt;/em&gt; (misalnya &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Map&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Perbedaan gaya ini memudahkan kita membedakan apakah suatu nama merujuk pada &lt;em&gt;module&lt;/em&gt; atau &lt;em&gt;variable&lt;/em&gt; hanya dengan melihatnya sekilas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Akhiran Tanda Tanya dan Tanda Seru
&lt;/h3&gt;

&lt;p&gt;Elixir mengizinkan penggunaan tanda tanya (&lt;code&gt;?&lt;/code&gt;) dan tanda seru (&lt;code&gt;!&lt;/code&gt;) di akhir nama &lt;em&gt;variable&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Kedua tanda ini tidak memengaruhi perilaku kode secara teknis, tetapi merupakan &lt;strong&gt;konvensi idiomatik&lt;/strong&gt; yang membantu pembaca memahami maksud kode dengan cepat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tanda tanya (&lt;code&gt;?&lt;/code&gt;)&lt;/strong&gt; menunjukkan bahwa nilai bersifat logis atau menghasilkan &lt;em&gt;boolean&lt;/em&gt;. Nama seperti &lt;code&gt;valid?&lt;/code&gt;, &lt;code&gt;empty?&lt;/code&gt;, atau &lt;code&gt;active?&lt;/code&gt; biasanya menandakan pertanyaan yang dapat dijawab "ya" atau "tidak".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tanda seru (&lt;code&gt;!&lt;/code&gt;)&lt;/strong&gt; menandai nilai atau operasi penting, tegas, atau berpotensi berisiko. Dalam konteks &lt;em&gt;variable&lt;/em&gt;, tanda ini sering digunakan untuk menandakan bahwa nilai tersebut sudah diverifikasi atau &lt;em&gt;dijamin ada&lt;/em&gt;. Contohnya, &lt;code&gt;important_data!&lt;/code&gt; dapat berarti “nilai ini pasti tersedia dan aman digunakan”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh penggunaannya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;user_valid?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;important_data!&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Nilai ini dijamin tersedia"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meskipun konvensi ini tidak wajib, penamaan yang konsisten membuat kode jauh lebih mudah dibaca dan dipahami, baik oleh diri sendiri maupun orang lain di masa depan.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Rebinding&lt;/em&gt; - Memperbarui Nilai Variabel
&lt;/h2&gt;

&lt;p&gt;Semua data di Elixir bersifat &lt;em&gt;immutable&lt;/em&gt;, artinya nilai yang sudah dibuat tidak dapat diubah. Jadi, ketika kita menulis ulang sebuah &lt;em&gt;variable&lt;/em&gt; seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6_000_000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;yang terjadi bukan penggantian isi nilai lama, melainkan &lt;strong&gt;pembuatan nilai baru&lt;/strong&gt; dan &lt;strong&gt;pengaitan ulang nama&lt;/strong&gt; &lt;code&gt;monthly_salary&lt;/code&gt; ke nilai tersebut.&lt;/p&gt;

&lt;p&gt;Proses ini disebut &lt;em&gt;rebinding&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Secara konseptual, &lt;em&gt;rebinding&lt;/em&gt; adalah cara Elixir mempertahankan fleksibilitas tanpa melanggar prinsip &lt;em&gt;immutability&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Kita tetap dapat "memperbarui" &lt;em&gt;variable&lt;/em&gt;, tetapi yang berubah hanyalah hubungan antara nama dan nilai, bukan isi nilai itu sendiri. Nilai lama tetap ada di memori hingga &lt;em&gt;garbage collector&lt;/em&gt; menghapusnya secara otomatis.&lt;/p&gt;

&lt;p&gt;Contoh &lt;em&gt;rebinding&lt;/em&gt; di IEx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5_000_000&lt;/span&gt;  &lt;span class="err"&gt;❶&lt;/span&gt;
&lt;span class="mi"&gt;5000000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt;  &lt;span class="err"&gt;❷&lt;/span&gt;
&lt;span class="mi"&gt;5000000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5_123_000&lt;/span&gt;  &lt;span class="err"&gt;❸&lt;/span&gt;
&lt;span class="mi"&gt;5123000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt;  &lt;span class="err"&gt;❹&lt;/span&gt;
&lt;span class="mi"&gt;5123000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ Nama &lt;code&gt;monthly_salary&lt;/code&gt; pertama kali di-&lt;em&gt;bind&lt;/em&gt; ke nilai &lt;code&gt;5_000_000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❷ Saat diperiksa, nama tersebut mengacu pada nilai &lt;code&gt;5000000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❸ Nama &lt;code&gt;monthly_salary&lt;/code&gt; kemudian di-&lt;em&gt;rebind&lt;/em&gt; ke nilai baru &lt;code&gt;5_123_000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❹ Kini &lt;code&gt;monthly_salary&lt;/code&gt; mengacu pada nilai baru &lt;code&gt;5123000&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setiap kali kita melakukan &lt;em&gt;rebinding&lt;/em&gt;, BEAM (mesin virtual yang menjalankan Elixir) tidak mengubah nilai lama di memori. Ia membuat &lt;strong&gt;alokasi baru&lt;/strong&gt; untuk nilai baru dan memperbarui referensi nama ke sana. Jika tidak ada referensi yang tersisa ke nilai lama, BEAM akan menghapusnya melalui mekanisme &lt;em&gt;garbage collection&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manajemen Memori di Elixir
&lt;/h2&gt;

&lt;p&gt;Elixir menggunakan &lt;em&gt;garbage collector&lt;/em&gt; (GC) yang terintegrasi di dalam &lt;em&gt;runtime&lt;/em&gt; BEAM untuk mengelola memori secara otomatis.&lt;/p&gt;

&lt;p&gt;Tugas utama GC adalah mendeteksi data yang sudah tidak lagi digunakan dan membebaskan ruang memori yang ditempati data tersebut.&lt;/p&gt;

&lt;p&gt;Kita dapat melihat peran GC ketika melakukan &lt;em&gt;rebinding&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5_000_000&lt;/span&gt;
&lt;span class="mi"&gt;5000000&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;monthly_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6_000_000&lt;/span&gt;
&lt;span class="mi"&gt;6000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah baris kedua dijalankan, nama &lt;code&gt;monthly_salary&lt;/code&gt; tidak lagi mengacu pada nilai &lt;code&gt;5_000_000&lt;/code&gt;, melainkan pada nilai baru &lt;code&gt;6_000_000&lt;/code&gt;. Karena tidak ada referensi lain yang menunjuk ke nilai lama, BEAM menandainya sebagai data yang tidak dibutuhkan lagi. &lt;em&gt;Garbage collector&lt;/em&gt; kemudian membebaskan memori yang digunakan nilai tersebut agar dapat dipakai ulang oleh sistem.&lt;/p&gt;

&lt;p&gt;Yang membuat BEAM istimewa adalah cara kerjanya yang &lt;strong&gt;berbasis proses&lt;/strong&gt;.&lt;br&gt;
Setiap proses Elixir memiliki ruang memori sendiri (&lt;em&gt;heap&lt;/em&gt;) dan &lt;em&gt;garbage collector&lt;/em&gt;-nya sendiri. Dengan demikian, setiap proses menjalankan manajemen memorinya secara independen. Ketika satu proses melakukan &lt;em&gt;garbage collection&lt;/em&gt;, proses lain tetap berjalan tanpa terhenti, sehingga sistem secara keseluruhan tetap responsif.&lt;/p&gt;

&lt;p&gt;Pendekatan ini memberikan dua keuntungan utama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efisiensi dan prediktabilitas&lt;/strong&gt;: setiap proses hanya mengelola memorinya sendiri, sehingga siklus &lt;em&gt;garbage collection&lt;/em&gt; berlangsung cepat dan terukur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stabilitas sistem&lt;/strong&gt;: masalah pada satu proses tidak memengaruhi proses lain, membuat sistem tetap berjalan bahkan di bawah beban tinggi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semua ini berlangsung otomatis di belakang layar, kita tidak perlu mengatur alokasi atau pembebasan memori secara manual seperti pada bahasa C atau C++.&lt;/p&gt;

&lt;p&gt;Elixir dan BEAM menangani seluruh siklus hidup data secara mandiri, memungkinkan kita fokus pada logika program tanpa khawatir terhadap kebocoran memori atau pengelolaan sumber daya yang rumit.&lt;/p&gt;

&lt;p&gt;Arsitektur &lt;em&gt;per-process garbage collection&lt;/em&gt; inilah yang membuat sistem berbasis Elixir dapat berjalan terus-menerus selama bertahun-tahun tanpa perlu dimatikan atau &lt;em&gt;restart&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jurić, S. (2024). &lt;em&gt;Elixir in Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>IEx: Elixir's Interactive Shell</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 09 Jul 2025 18:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/iex-elixirs-interactive-shell-1hbk</link>
      <guid>https://dev.to/muzhawir/iex-elixirs-interactive-shell-1hbk</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
Starting and Writing Expressions in IEx

&lt;ul&gt;
&lt;li&gt;Starting an IEx Session and Evaluating Expressions&lt;/li&gt;
&lt;li&gt;Multi-line Expressions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reading Documentation in IEx&lt;/li&gt;

&lt;li&gt;How We Debug in IEx&lt;/li&gt;

&lt;li&gt;Exiting the IEx Session or Viewing Other Options&lt;/li&gt;

&lt;li&gt;References&lt;/li&gt;

&lt;/ul&gt;



&lt;h2&gt;
  
  
  Starting and Writing Expressions in IEx
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Starting an IEx Session and Evaluating Expressions
&lt;/h3&gt;

&lt;p&gt;IEx (&lt;em&gt;Interactive Elixir&lt;/em&gt;) is Elixir’s built-in interactive shell or REPL (&lt;em&gt;read–eval–print loop&lt;/em&gt;) that allows us to run code directly in the terminal. Through IEx, we can explore language features, read documentation, perform debugging, and more. Since it’s part of Elixir by default, we don’t need to install anything to get started.&lt;/p&gt;

&lt;p&gt;To start a session, we simply run the &lt;code&gt;iex&lt;/code&gt; command in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;iex&lt;/span&gt;
&lt;span class="no"&gt;Erlang&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="no"&gt;OTP&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;erts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;14.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;smp:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;ds:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="no"&gt;Interactive&lt;/span&gt; &lt;span class="no"&gt;Elixir&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.15&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;press&lt;/span&gt; &lt;span class="no"&gt;Ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="no"&gt;C&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="no"&gt;ENTER&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# This is where we type Elixir expressions.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When IEx starts, it displays the current Erlang and Elixir runtime versions. After that, the &lt;code&gt;iex(1)&amp;gt;&lt;/code&gt; prompt appears, where we can enter expressions. The number in parentheses shows the evaluation count.&lt;/p&gt;

&lt;p&gt;Let’s try our first expression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;❶&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;            &lt;span class="err"&gt;❷&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ We type the expression &lt;code&gt;1 + 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❷ IEx evaluates it and automatically prints the result: &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Elixir, almost everything is an expression that returns a value. This includes function calls, &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;case&lt;/code&gt;, and many more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-line Expressions
&lt;/h3&gt;

&lt;p&gt;IEx also supports writing expressions across multiple lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;    &lt;span class="err"&gt;❶&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;❷&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="err"&gt;❸&lt;/span&gt;
&lt;span class="mf"&gt;2.0&lt;/span&gt;              &lt;span class="err"&gt;❹&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ We begin an expression, but it’s not yet complete due to the open parenthesis.&lt;/li&gt;
&lt;li&gt;❷ The &lt;code&gt;...(1)&amp;gt;&lt;/code&gt; prompt appears because IEx is still waiting for us to finish the expression.&lt;/li&gt;
&lt;li&gt;❸ Once the expression is complete, we press &lt;code&gt;Enter&lt;/code&gt; again to evaluate it.&lt;/li&gt;
&lt;li&gt;❹ IEx returns the result: &lt;code&gt;2.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As long as an expression is incomplete, IEx will continue waiting for more input. This feature is useful when we want to write longer expressions in a more readable and structured way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading Documentation in IEx
&lt;/h2&gt;

&lt;p&gt;IEx includes a built-in help feature that lets us read documentation directly from the shell. To start, we just type &lt;code&gt;h&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;

                                  &lt;span class="no"&gt;IEx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Helpers&lt;/span&gt;

&lt;span class="no"&gt;Welcome&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="no"&gt;Interactive&lt;/span&gt; &lt;span class="no"&gt;Elixir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;You&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;currently&lt;/span&gt; &lt;span class="n"&gt;seeing&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;documentation&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt;
&lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="no"&gt;IEx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Helpers&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;provides&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="n"&gt;helpers&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="no"&gt;Elixir&lt;/span&gt;&lt;span class="s1"&gt;'s shell more
joyful to work with.

This message was triggered by invoking the helper h(), usually referred to as
h/0 (since it expects 0 arguments).

...... (and so on)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This displays the documentation for the &lt;code&gt;IEx.Helpers&lt;/code&gt; module, which provides various helpers to make working with IEx easier.&lt;/p&gt;

&lt;p&gt;If we want to view documentation for a specific function, such as &lt;code&gt;IO.puts&lt;/code&gt;, we can use &lt;code&gt;h&lt;/code&gt; followed by the module and function name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;

                        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="p"&gt;\\&lt;/span&gt; &lt;span class="ss"&gt;:stdio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nv"&gt;@spec&lt;/span&gt; &lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;chardata&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Chars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="ss"&gt;:ok&lt;/span&gt;

&lt;span class="no"&gt;Writes&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;given&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;similar&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;adds&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="no"&gt;By&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;standard&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;It&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt; &lt;span class="ss"&gt;:ok&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;succeeds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## Examples&lt;/span&gt;

    &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#=&amp;gt; Hello World!&lt;/span&gt;

&lt;span class="o"&gt;......&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From this output, we can see the &lt;em&gt;type spec&lt;/em&gt; (the data types accepted by the arguments and the return value), a brief explanation of the &lt;code&gt;IO.puts&lt;/code&gt; function, the return value, and example usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Debug in IEx
&lt;/h2&gt;

&lt;p&gt;One way we can debug in IEx is by using the &lt;code&gt;dbg/1&lt;/code&gt; function. This function prints the expression being evaluated along with its result, shown to the right of the &lt;code&gt;#=&amp;gt;&lt;/code&gt; symbol. It helps us trace how data flows through each step.&lt;/p&gt;

&lt;p&gt;Here’s a simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;20.22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;iex:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;20.22&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 220.22&lt;/span&gt;

&lt;span class="mf"&gt;220.22&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;dbg&lt;/code&gt; prints both the expression &lt;code&gt;200 + 20.22&lt;/code&gt; and its result: &lt;code&gt;220.22&lt;/code&gt;. The final result is still returned as usual.&lt;/p&gt;

&lt;p&gt;Since Elixir is a functional language, we often build complex logic by chaining multiple functions together. In this context, &lt;code&gt;dbg&lt;/code&gt; becomes especially helpful. This is particularly true when we are working with pipelines. A pipeline is Elixir’s idiomatic way to pass data through a sequence of functions using the pipe operator &lt;code&gt;|&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We will cover pipelines in more detail in a separate section. For now, we just need to understand that &lt;code&gt;dbg&lt;/code&gt; allows us to trace the value at each stage of execution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;❶&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;iex:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;          &lt;span class="err"&gt;❷&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; -100             ❷&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; -25         ❷&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 25           ❷&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "25"   ❷&lt;/span&gt;

&lt;span class="s2"&gt;"25"&lt;/span&gt;                      &lt;span class="err"&gt;❸&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;❶ We create a simple pipeline. The initial value &lt;code&gt;-100&lt;/code&gt; is passed through each function in order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;div(4)&lt;/code&gt; returns &lt;code&gt;-25&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;abs()&lt;/code&gt; returns &lt;code&gt;25&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;to_string()&lt;/code&gt; returns &lt;code&gt;"25"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dbg/1&lt;/code&gt; prints each stage&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;❷ This is the output from &lt;code&gt;dbg&lt;/code&gt;, showing how the value is transformed at each stage in the pipeline.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;❸ The final result of the expression is still returned. In this case, it is &lt;code&gt;"25"&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;With &lt;code&gt;dbg&lt;/code&gt;, we can inspect the execution flow in detail, without needing to insert &lt;code&gt;IO.puts&lt;/code&gt; at every step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exiting the IEx Session or Viewing Other Options
&lt;/h2&gt;

&lt;p&gt;The fastest way to exit an IEx session is by pressing &lt;code&gt;CTRL+C&lt;/code&gt; twice. If we press it only once, IEx will enter &lt;strong&gt;BREAK&lt;/strong&gt; mode and display a menu like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;iex&lt;/span&gt;
&lt;span class="no"&gt;Erlang&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="no"&gt;OTP&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;erts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;15.2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;smp:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;ds:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;
&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;jit:&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="no"&gt;Interactive&lt;/span&gt; &lt;span class="no"&gt;Elixir&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.17&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;press&lt;/span&gt; &lt;span class="no"&gt;Ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="no"&gt;C&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="no"&gt;ENTER&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="ss"&gt;BREAK:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;bort&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;bort&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;dump&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ontinue&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;roc&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;nfo&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;oaded&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ersion&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ill&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;D&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;istribution&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When in BREAK mode, IEx will wait for our command. Some commonly used options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;(a)bort&lt;/code&gt;: Exit the IEx session.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(A)bort with dump&lt;/code&gt;: Exit while generating a dump for debugging.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(c)ontinue&lt;/code&gt;: Resume the paused session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To exit IEx completely, we can either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;CTRL+C&lt;/code&gt; twice in a row, or&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;a&lt;/code&gt; while in BREAK mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since IEx is a tool we use frequently during development, understanding how to manage sessions early on helps keep our workflow smooth.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Saša Jurić. (2024). &lt;em&gt;Elixir In Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;li&gt;Elixir. (2024, December 11). &lt;em&gt;IEx&lt;/em&gt; [Documentation]. &lt;a href="https://hexdocs.pm/iex/IEx.html" rel="noopener noreferrer"&gt;https://hexdocs.pm/iex/IEx.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>cli</category>
    </item>
    <item>
      <title>IEx: Shell Interaktif Elixir</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 02 Jul 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/iex-shell-interaktif-elixir-28cb</link>
      <guid>https://dev.to/muzhawir/iex-shell-interaktif-elixir-28cb</guid>
      <description>&lt;h2&gt;
  
  
  Daftar Isi
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;Memulai dan Menulis Ekspresi di IEx&lt;/li&gt;
&lt;li&gt;
Membaca Dokumentasi di IEx

&lt;ul&gt;
&lt;li&gt;Melihat Dokumentasi &lt;em&gt;Module&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Melihat Dokumentasi &lt;em&gt;Function&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Cara &lt;em&gt;Debugging&lt;/em&gt; di IEx

&lt;ul&gt;
&lt;li&gt;Menggunakan &lt;code&gt;dbg/1&lt;/code&gt; di Dalam &lt;em&gt;Pipeline&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Keluar dari Sesi IEx atau Menampilkan Opsi Lainnya&lt;/li&gt;

&lt;li&gt;Referensi&lt;/li&gt;

&lt;/ul&gt;






&lt;p&gt;Sebelum menulis program yang kompleks, kita perlu memahami cara berinteraksi langsung dengan Elixir melalui &lt;em&gt;Interactive Elixir Shell&lt;/em&gt; atau IEx. Lingkungan ini memungkinkan kita menjalankan ekspresi, mengeksplorasi &lt;em&gt;modules&lt;/em&gt; dan &lt;em&gt;functions&lt;/em&gt;, membaca dokumentasi, serta melakukan &lt;em&gt;debugging&lt;/em&gt; secara interaktif. Dengan IEx, kita dapat bereksperimen dan mengamati hasil secara langsung tanpa perlu membuat file atau proyek baru. Pada pelajaran ini, kita akan mempelajari dasar cara menggunakan IEx, mulai dari menulis ekspresi sederhana hingga memanfaatkan fitur bawaan seperti &lt;em&gt;documentation lookup&lt;/em&gt;, &lt;em&gt;pipeline inspection&lt;/em&gt;, dan &lt;em&gt;runtime debugging&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memulai dan Menulis Ekspresi di IEx
&lt;/h2&gt;

&lt;p&gt;IEx (&lt;em&gt;Interactive Elixir&lt;/em&gt;) adalah &lt;em&gt;shell&lt;/em&gt; interaktif bawaan Elixir, berfungsi sebagai REPL (&lt;em&gt;read-eval-print loop&lt;/em&gt;) yang memungkinkan kita menjalankan kode langsung dari terminal. Dengan IEx, kita dapat mengeksplorasi fitur bahasa, membaca dokumentasi, melakukan &lt;em&gt;debugging&lt;/em&gt;, serta mencoba eksperimen kecil. Karena IEx sudah termasuk dalam distribusi Elixir, kita tidak perlu menginstal apa pun tambahan.&lt;/p&gt;

&lt;p&gt;Untuk memulai sesi, jalankan perintah berikut di terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;iex
Erlang/OTP 26 &lt;span class="o"&gt;[&lt;/span&gt;erts-14.0] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;64-bit] &lt;span class="o"&gt;[&lt;/span&gt;smp:20:20] &lt;span class="o"&gt;[&lt;/span&gt;ds:20:20:10]

Interactive Elixir &lt;span class="o"&gt;(&lt;/span&gt;1.15.0&lt;span class="o"&gt;)&lt;/span&gt; - press Ctrl+C to &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type &lt;/span&gt;h&lt;span class="o"&gt;()&lt;/span&gt; ENTER &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

iex&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;# Di sinilah kita mengetikkan ekspresi Elixir&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saat IEx dijalankan, ia menampilkan versi &lt;em&gt;runtime&lt;/em&gt; Erlang dan Elixir yang digunakan. Setelah itu muncul &lt;em&gt;prompt&lt;/em&gt; &lt;code&gt;iex(1)&amp;gt;&lt;/code&gt; sebagai tempat mengetikkan ekspresi. Angka dalam tanda kurung menunjukkan urutan evaluasi ekspresi.&lt;/p&gt;

&lt;p&gt;Contoh ekspresi sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;❶&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;❷&lt;/span&gt;

&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="err"&gt;❸&lt;/span&gt;
&lt;span class="no"&gt;Hello&lt;/span&gt; &lt;span class="no"&gt;World&lt;/span&gt;&lt;span class="n"&gt;!&lt;/span&gt;  &lt;span class="err"&gt;❹&lt;/span&gt;
&lt;span class="ss"&gt;:ok&lt;/span&gt;  &lt;span class="err"&gt;❺&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ Kita mengetikkan ekspresi &lt;code&gt;1 + 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❷ IEx mengevaluasinya dan menampilkan hasil &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❸ Kita menjalankan &lt;em&gt;function&lt;/em&gt; &lt;code&gt;IO.puts/1&lt;/code&gt; untuk mencetak teks ke layar.&lt;/li&gt;
&lt;li&gt;❹ Nilai &lt;code&gt;"Hello World!"&lt;/code&gt; muncul di terminal sebagai hasil cetakan.&lt;/li&gt;
&lt;li&gt;❺ Setelah menampilkan teks, &lt;code&gt;IO.puts/1&lt;/code&gt; mengembalikan nilai &lt;code&gt;:ok&lt;/code&gt;, menandakan bahwa operasi berhasil tanpa kesalahan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;function&lt;/em&gt; &lt;code&gt;IO.puts/1&lt;/code&gt; adalah cara paling dasar untuk menampilkan informasi di terminal. Dalam konteks Elixir, setiap &lt;em&gt;function&lt;/em&gt; selalu mengembalikan nilai, bahkan &lt;em&gt;function&lt;/em&gt; yang hanya memiliki efek samping seperti mencetak teks. Hal ini memperlihatkan bahwa Elixir tetap menjaga konsistensi paradigma fungsional, yaitu setiap pernyataan adalah ekspresi yang dapat menghasilkan nilai.&lt;/p&gt;

&lt;p&gt;Dalam Elixir, hampir semua hal adalah ekspresi (&lt;em&gt;expression&lt;/em&gt;), artinya setiap perintah selalu menghasilkan &lt;strong&gt;nilai&lt;/strong&gt;. Memanggil &lt;em&gt;function&lt;/em&gt;, menulis &lt;code&gt;if&lt;/code&gt;, atau menggunakan &lt;code&gt;case&lt;/code&gt; bukan sekadar menjalankan instruksi, melainkan juga menghasilkan sesuatu yang dapat disimpan atau digunakan di bagian lain program.&lt;/p&gt;

&lt;p&gt;IEx juga mendukung penulisan ekspresi yang terdiri dari beberapa baris, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;    &lt;span class="err"&gt;❶&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;❷&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="err"&gt;❸&lt;/span&gt;
&lt;span class="mf"&gt;2.0&lt;/span&gt;              &lt;span class="err"&gt;❹&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ Kita mulai menulis ekspresi, tetapi tanda kurung belum ditutup.&lt;/li&gt;
&lt;li&gt;❷ &lt;em&gt;Prompt&lt;/em&gt; berubah menjadi &lt;code&gt;...(1)&amp;gt;&lt;/code&gt;, menandakan bahwa ekspresi masih berlanjut.&lt;/li&gt;
&lt;li&gt;❸ Setelah ekspresi lengkap, tekan &lt;code&gt;Enter&lt;/code&gt; untuk mengeksekusinya.&lt;/li&gt;
&lt;li&gt;❹ IEx mengevaluasi ekspresi dan menampilkan hasil &lt;code&gt;2.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selama ekspresi belum lengkap, IEx akan tetap menunggu input tambahan. Fitur ini memudahkan kita menulis ekspresi panjang agar lebih rapi dan mudah dibaca.&lt;/p&gt;

&lt;h2&gt;
  
  
  Membaca Dokumentasi di IEx
&lt;/h2&gt;

&lt;p&gt;IEx memiliki fitur bawaan untuk membaca dokumentasi langsung dari &lt;em&gt;shell&lt;/em&gt;. Dengan perintah &lt;code&gt;h&lt;/code&gt;, kita dapat menampilkan dokumentasi dari sebuah &lt;em&gt;module&lt;/em&gt; atau &lt;em&gt;function&lt;/em&gt; tanpa harus keluar dari terminal.&lt;/p&gt;

&lt;p&gt;Dalam Elixir, sebuah &lt;em&gt;module&lt;/em&gt; berfungsi sebagai wadah yang mengelompokkan sejumlah &lt;em&gt;function&lt;/em&gt; yang memiliki keterkaitan logis. Sementara &lt;em&gt;function&lt;/em&gt; adalah unit kode yang menerima &lt;em&gt;input&lt;/em&gt;, memprosesnya, lalu menghasilkan &lt;em&gt;output&lt;/em&gt;. Pembahasan lebih mendalam tentang keduanya akan kita temui di bagian selanjutnya. Untuk saat ini, cukup kita pahami bahwa perintah &lt;code&gt;h&lt;/code&gt; dapat digunakan untuk membaca dokumentasi keduanya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Melihat Dokumentasi &lt;em&gt;Module&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Untuk menampilkan dokumentasi sebuah &lt;em&gt;module&lt;/em&gt;, gunakan &lt;code&gt;h&lt;/code&gt; diikuti nama &lt;em&gt;module&lt;/em&gt;-nya. Contohnya, untuk melihat dokumentasi bawaan &lt;code&gt;IEx.Helpers&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="no"&gt;IEx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Helpers&lt;/span&gt;

                                  &lt;span class="no"&gt;IEx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Helpers&lt;/span&gt;

&lt;span class="no"&gt;Welcome&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="no"&gt;Interactive&lt;/span&gt; &lt;span class="no"&gt;Elixir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;You&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;currently&lt;/span&gt; &lt;span class="n"&gt;seeing&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;documentation&lt;/span&gt; &lt;span class="n"&gt;for&lt;/span&gt;
&lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="no"&gt;IEx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Helpers&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;provides&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="n"&gt;helpers&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="no"&gt;Elixir&lt;/span&gt;&lt;span class="s1"&gt;'s shell more
joyful to work with.

This message was triggered by invoking the helper h(), usually referred to as
h/0 (since it expects 0 arguments).

...... (dan seterusnya)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasil tersebut menampilkan dokumentasi lengkap untuk &lt;em&gt;module&lt;/em&gt; &lt;code&gt;IEx.Helpers&lt;/code&gt;, yang berisi kumpulan &lt;em&gt;helper functions&lt;/em&gt; yang dapat digunakan di dalam sesi IEx. &lt;em&gt;Module&lt;/em&gt; ini menyediakan berbagai utilitas yang memudahkan kita mengeksplorasi dan memahami fitur-fitur Elixir secara interaktif.&lt;/p&gt;

&lt;h3&gt;
  
  
  Melihat Dokumentasi &lt;em&gt;Function&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Untuk membaca dokumentasi sebuah &lt;em&gt;function&lt;/em&gt;, tuliskan &lt;code&gt;h&lt;/code&gt; diikuti nama &lt;em&gt;module&lt;/em&gt; dan &lt;em&gt;function&lt;/em&gt;-nya. Misalnya, untuk melihat dokumentasi &lt;code&gt;IO.puts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;

                        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="p"&gt;\\&lt;/span&gt; &lt;span class="ss"&gt;:stdio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nv"&gt;@spec&lt;/span&gt; &lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;chardata&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Chars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="ss"&gt;:ok&lt;/span&gt;  &lt;span class="err"&gt;❶&lt;/span&gt;

&lt;span class="no"&gt;Writes&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;given&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;similar&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;adds&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="err"&gt;❷&lt;/span&gt;

&lt;span class="no"&gt;By&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;standard&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;It&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt; &lt;span class="ss"&gt;:ok&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;succeeds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="err"&gt;❸&lt;/span&gt;

&lt;span class="c1"&gt;## Examples  ❹&lt;/span&gt;

    &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#=&amp;gt; Hello World!&lt;/span&gt;

&lt;span class="o"&gt;......&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dan&lt;/span&gt; &lt;span class="n"&gt;seterusnya&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dari hasil tersebut, kita dapat mempelajari beberapa hal penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ &lt;strong&gt;Type spec&lt;/strong&gt; (&lt;code&gt;@spec&lt;/code&gt;) menjelaskan tipe data dari argumen dan nilai kembalian. Dalam contoh ini, &lt;em&gt;function&lt;/em&gt; menerima &lt;em&gt;device&lt;/em&gt; (seperti &lt;code&gt;:stdio&lt;/code&gt;) dan &lt;em&gt;string&lt;/em&gt; atau &lt;em&gt;chardata&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;❷ &lt;strong&gt;Deskripsi &lt;em&gt;function&lt;/em&gt;&lt;/strong&gt; menjelaskan bahwa &lt;code&gt;IO.puts&lt;/code&gt; menulis teks ke perangkat keluaran dan menambahkan baris baru di akhir.&lt;/li&gt;
&lt;li&gt;❸ &lt;strong&gt;Nilai kembalian&lt;/strong&gt; berupa &lt;code&gt;:ok&lt;/code&gt; menunjukkan eksekusi berhasil tanpa kesalahan.&lt;/li&gt;
&lt;li&gt;❹ &lt;strong&gt;Contoh penggunaan&lt;/strong&gt; dapat langsung dijalankan di IEx untuk memastikan perilaku &lt;em&gt;function&lt;/em&gt; sesuai deskripsi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fitur &lt;code&gt;h&lt;/code&gt; menjadikan IEx bukan sekadar alat eksperimen, tetapi juga &lt;em&gt;documentation browser&lt;/em&gt; yang cepat dan praktis. Membaca dokumentasi langsung di IEx membantu kita memahami perilaku &lt;em&gt;function&lt;/em&gt; dan &lt;em&gt;module&lt;/em&gt; tanpa berpindah konteks, yang merupakan kebiasaan penting dalam ekosistem Elixir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cara &lt;em&gt;Debugging&lt;/em&gt; di IEx
&lt;/h2&gt;

&lt;p&gt;Salah satu cara paling efisien untuk melakukan &lt;em&gt;debugging&lt;/em&gt; di IEx adalah dengan menggunakan &lt;em&gt;function&lt;/em&gt; &lt;code&gt;dbg/1&lt;/code&gt;. &lt;em&gt;Function&lt;/em&gt; ini menampilkan ekspresi yang dievaluasi beserta hasilnya di sebelah kanan simbol &lt;code&gt;#=&amp;gt;&lt;/code&gt;. Fitur ini sangat berguna untuk melacak perubahan data pada setiap tahap eksekusi, terutama ketika kita ingin memahami bagaimana suatu nilai berubah dari satu langkah ke langkah berikutnya.&lt;/p&gt;

&lt;p&gt;Contoh sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;20.22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;iex:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;20.22&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 220.22&lt;/span&gt;

&lt;span class="mf"&gt;220.22&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dbg/1&lt;/code&gt; menampilkan ekspresi &lt;code&gt;200 + 20.22&lt;/code&gt; dan hasil evaluasinya, yaitu &lt;code&gt;220.22&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Nilai akhir tetap dikembalikan, sehingga tidak mengubah alur eksekusi program.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Karena Elixir merupakan bahasa pemrograman fungsional, logika program biasanya dibangun dengan merangkai banyak &lt;em&gt;function&lt;/em&gt; yang mengalirkan data dari satu tahap ke tahap berikutnya. Dalam konteks ini, &lt;code&gt;dbg/1&lt;/code&gt; menjadi &lt;em&gt;function&lt;/em&gt; yang sangat membantu untuk memeriksa data di tengah aliran eksekusi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Menggunakan &lt;code&gt;dbg/1&lt;/code&gt; di Dalam &lt;em&gt;Pipeline&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Pipeline&lt;/em&gt; adalah mekanisme khas Elixir untuk mengalirkan data melalui serangkaian &lt;em&gt;function&lt;/em&gt; menggunakan &lt;em&gt;pipe operator&lt;/em&gt; &lt;code&gt;|&amp;gt;&lt;/code&gt;. Pembahasan mendalam tentang &lt;em&gt;pipeline&lt;/em&gt; akan kita temui di bagian tersendiri, tetapi untuk saat ini cukup kita pahami bahwa &lt;code&gt;dbg/1&lt;/code&gt; memungkinkan kita memantau nilai di setiap tahap proses tanpa menghentikan aliran data.&lt;/p&gt;

&lt;p&gt;Contohnya, kita akan mengubah &lt;em&gt;string&lt;/em&gt; &lt;code&gt;" hello world "&lt;/code&gt; yang memiliki spasi di awal dan akhir menjadi bentuk yang rapi, huruf kapital semua, lalu menghitung panjangnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"  hello world  "&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upcase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;iex:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="s2"&gt;"  hello world  "&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "  hello world  "&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "hello world"&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upcase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; "HELLO WORLD"&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 11&lt;/span&gt;

&lt;span class="mi"&gt;11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasan langkah-langkahnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nilai awal &lt;code&gt;" hello world "&lt;/code&gt; dialirkan melalui beberapa &lt;em&gt;function&lt;/em&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;String.trim()&lt;/code&gt; menghapus spasi di awal dan akhir.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String.upcase()&lt;/code&gt; mengubah seluruh huruf menjadi kapital.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String.length()&lt;/code&gt; menghitung jumlah karakter dalam &lt;em&gt;string&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dbg/1&lt;/code&gt; menampilkan hasil di setiap tahap &lt;em&gt;pipeline&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Output &lt;code&gt;dbg/1&lt;/code&gt; memperlihatkan bagaimana data berubah dari &lt;em&gt;string&lt;/em&gt; mentah menjadi nilai numerik.&lt;/li&gt;

&lt;li&gt;Nilai akhir &lt;code&gt;11&lt;/code&gt; tetap dikembalikan sebagai hasil evaluasi ekspresi.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Dengan &lt;code&gt;dbg/1&lt;/code&gt;, kita dapat melakukan &lt;em&gt;debugging&lt;/em&gt; secara langsung di dalam &lt;em&gt;pipeline&lt;/em&gt; tanpa harus memecah ekspresi menjadi beberapa baris kode terpisah. Pendekatan ini sangat sesuai dengan gaya eksplorasi interaktif yang menjadi ciri khas IEx dan filosofi Elixir yang menekankan keterbacaan serta transparansi dalam aliran data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keluar dari Sesi IEx atau Menampilkan Opsi Lainnya
&lt;/h2&gt;

&lt;p&gt;Cara paling cepat untuk keluar dari sesi IEx adalah dengan menekan &lt;code&gt;CTRL+C&lt;/code&gt; dua kali. Jika hanya ditekan sekali, IEx akan memasuki kondisi &lt;strong&gt;BREAK&lt;/strong&gt; dan menampilkan menu opsi seperti berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;iex
Erlang/OTP 27 &lt;span class="o"&gt;[&lt;/span&gt;erts-15.2] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;64-bit] &lt;span class="o"&gt;[&lt;/span&gt;smp:4:4] &lt;span class="o"&gt;[&lt;/span&gt;ds:4:4:10] &lt;span class="o"&gt;[&lt;/span&gt;async-threads:1] &lt;span class="o"&gt;[&lt;/span&gt;jit:ns]

Interactive Elixir &lt;span class="o"&gt;(&lt;/span&gt;1.17.3&lt;span class="o"&gt;)&lt;/span&gt; - press Ctrl+C to &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type &lt;/span&gt;h&lt;span class="o"&gt;()&lt;/span&gt; ENTER &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
iex&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt;
BREAK: &lt;span class="o"&gt;(&lt;/span&gt;a&lt;span class="o"&gt;)&lt;/span&gt;bort &lt;span class="o"&gt;(&lt;/span&gt;A&lt;span class="o"&gt;)&lt;/span&gt;bort with dump &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt;ontinue &lt;span class="o"&gt;(&lt;/span&gt;p&lt;span class="o"&gt;)&lt;/span&gt;roc info &lt;span class="o"&gt;(&lt;/span&gt;i&lt;span class="o"&gt;)&lt;/span&gt;nfo
       &lt;span class="o"&gt;(&lt;/span&gt;l&lt;span class="o"&gt;)&lt;/span&gt;oaded &lt;span class="o"&gt;(&lt;/span&gt;v&lt;span class="o"&gt;)&lt;/span&gt;ersion &lt;span class="o"&gt;(&lt;/span&gt;k&lt;span class="o"&gt;)&lt;/span&gt;ill &lt;span class="o"&gt;(&lt;/span&gt;D&lt;span class="o"&gt;)&lt;/span&gt;b-tables &lt;span class="o"&gt;(&lt;/span&gt;d&lt;span class="o"&gt;)&lt;/span&gt;istribution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ketika IEx berada dalam kondisi &lt;strong&gt;BREAK&lt;/strong&gt;, sistem akan menunggu perintah dari pengguna. Kondisi ini memberi kita kendali untuk melanjutkan sesi, memeriksa status sistem, atau keluar sepenuhnya dari lingkungan interaktif.&lt;/p&gt;

&lt;p&gt;Beberapa opsi yang paling umum digunakan antara lain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;(a)bort&lt;/code&gt;: Mengakhiri sesi IEx sepenuhnya.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(A)bort with dump&lt;/code&gt;: Mengakhiri sesi dan membuat &lt;em&gt;dump file&lt;/em&gt; untuk keperluan &lt;em&gt;debugging&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(c)ontinue&lt;/code&gt;: Melanjutkan sesi IEx yang sebelumnya dihentikan sementara.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk benar-benar keluar dari IEx, kita dapat menggunakan salah satu dari dua cara berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menekan &lt;code&gt;CTRL+C&lt;/code&gt; dua kali secara cepat.&lt;/li&gt;
&lt;li&gt;Menekan &lt;code&gt;a&lt;/code&gt; saat berada dalam kondisi &lt;strong&gt;BREAK&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kedua cara tersebut akan menutup proses &lt;em&gt;Interactive Elixir Shell&lt;/em&gt; dan mengembalikan kontrol ke terminal sistem operasi. Dalam praktik sehari-hari, menekan &lt;code&gt;CTRL+C&lt;/code&gt; dua kali adalah cara yang paling umum digunakan karena lebih cepat dan tidak memerlukan interaksi tambahan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jurić, S. (2024). &lt;em&gt;Elixir in Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;li&gt;Elixir. (2024, December 11). &lt;em&gt;IEx.&lt;/em&gt; [Documentation]. Retrieved from &lt;a href="https://hexdocs.pm/iex/IEx.html" rel="noopener noreferrer"&gt;https://hexdocs.pm/iex/IEx.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Preparing the Elixir Development Environment</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 25 Jun 2025 18:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/preparing-the-elixir-development-environment-39ep</link>
      <guid>https://dev.to/muzhawir/preparing-the-elixir-development-environment-39ep</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📜 You can read the Indonesian version &lt;a href="https://dev.to/muzhawir/mempersiapkan-lingkungan-pengembangan-elixir-247"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;
What is the &lt;code&gt;asdf&lt;/code&gt; &lt;em&gt;version manager&lt;/em&gt;?

&lt;ul&gt;
&lt;li&gt;Why Choose &lt;code&gt;asdf&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Installing &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Using a &lt;em&gt;Package Manager&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Downloading the &lt;em&gt;Precompiled Binary&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Verifying the Binary Location&lt;/li&gt;
&lt;li&gt;Verifying the &lt;code&gt;asdf&lt;/code&gt; Installation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Installing Plugins in &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Erlang Plugin&lt;/li&gt;
&lt;li&gt;Elixir Plugin&lt;/li&gt;
&lt;li&gt;Node.js Plugin (Optional)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Installing Runtimes in &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Checking Elixir and Erlang Compatibility&lt;/li&gt;
&lt;li&gt;Checking Available Versions&lt;/li&gt;
&lt;li&gt;Installing Erlang&lt;/li&gt;
&lt;li&gt;Installing Elixir&lt;/li&gt;
&lt;li&gt;Installing Node.js (Optional)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Managing Runtime Versions in &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Setting Global Versions&lt;/li&gt;
&lt;li&gt;Setting Local Versions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

ElixirLS - Editor Extension for Elixir Development

&lt;ul&gt;
&lt;li&gt;Key Features of ElixirLS&lt;/li&gt;
&lt;li&gt;Installing ElixirLS in VS Code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;h2&gt;
  
  
  What is the &lt;code&gt;asdf&lt;/code&gt; &lt;em&gt;version manager&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8gs53351mvmtmlvl0v4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8gs53351mvmtmlvl0v4.png" alt="asdf banner" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Erlang and Elixir can be installed directly using the guides on the &lt;a href="https://www.erlang.org/downloads#prebuilt" rel="noopener noreferrer"&gt;Erlang/OTP download page&lt;/a&gt; and the &lt;a href="https://elixir-lang.org/install.html#by-operating-system" rel="noopener noreferrer"&gt;official Elixir site&lt;/a&gt;. However, this approach has limitations in a development context: the system can only handle one &lt;em&gt;runtime&lt;/em&gt; version at a time. If we want to use another version, a conflict will likely occur or the system will ask us to overwrite the version that is already installed.&lt;/p&gt;

&lt;p&gt;To overcome this, we can use a &lt;em&gt;version manager&lt;/em&gt;, a tool that lets us install and manage multiple &lt;em&gt;runtime&lt;/em&gt; versions side by side on a single system. This approach allows us to support various projects with different &lt;em&gt;runtime&lt;/em&gt; versions and switch between versions as needed.&lt;/p&gt;

&lt;p&gt;A &lt;em&gt;version manager&lt;/em&gt; also helps maintain consistency in a development team environment, because all members can use the same version and avoid compatibility issues.&lt;/p&gt;

&lt;p&gt;In this article, we will use a &lt;em&gt;version manager&lt;/em&gt; called &lt;a href="https://asdf-vm.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;asdf‑vm&lt;/strong&gt;&lt;/a&gt;, or simply &lt;strong&gt;asdf&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Choose &lt;code&gt;asdf&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;In modern software projects, we often need more than one &lt;em&gt;runtime&lt;/em&gt;, which also means we need several &lt;em&gt;version managers&lt;/em&gt; to handle them. For example, to develop an Elixir‑based web application, we might use &lt;code&gt;kerl&lt;/code&gt; for Erlang, &lt;code&gt;kiex&lt;/code&gt; for Elixir, and &lt;code&gt;nvm&lt;/code&gt; for Node.js. If each &lt;em&gt;runtime&lt;/em&gt; is managed with a different tool, environment management becomes complicated and adds cognitive load.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;asdf&lt;/code&gt; simplifies this by providing a single unified interface to manage various &lt;em&gt;runtimes&lt;/em&gt; through a &lt;em&gt;plugin&lt;/em&gt; system. With &lt;code&gt;asdf&lt;/code&gt;, we can install and switch between versions of Erlang, Elixir, Node.js, and dozens of other &lt;em&gt;runtimes&lt;/em&gt; using just one tool and a consistent command pattern.&lt;/p&gt;

&lt;p&gt;Some key advantages of &lt;code&gt;asdf&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uniform interface&lt;/strong&gt;, We don't need to learn different workflows for each &lt;em&gt;version manager&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensive plugin support&lt;/strong&gt;, including official plugins for Erlang and Elixir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross‑project and team consistency&lt;/strong&gt;, via the &lt;code&gt;.tool-versions&lt;/code&gt; file that explicitly declares the version of each &lt;em&gt;runtime&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are currently nearly 100 &lt;a href="https://github.com/asdf-community" rel="noopener noreferrer"&gt;plugins&lt;/a&gt; developed by the community. Because the plugins for Erlang and Elixir are developed officially, &lt;code&gt;asdf&lt;/code&gt; is a highly recommended choice for Elixir project development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;To install &lt;code&gt;asdf&lt;/code&gt;, there are two main methods: first, using a &lt;em&gt;package manager&lt;/em&gt;, and second, by downloading the &lt;em&gt;precompiled binary&lt;/em&gt; from GitHub. Other methods like &lt;code&gt;go install&lt;/code&gt; or building from source are also available, but we won’t cover those here. If you want to explore other approaches, you can refer to the official documentation &lt;a href="https://asdf-vm.com/guide/getting-started.html#_1-install-asdf" rel="noopener noreferrer"&gt;on this page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's start with the first method.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using a &lt;em&gt;Package Manager&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;This is the method recommended by the &lt;code&gt;asdf&lt;/code&gt; maintainers. Currently, three package managers are officially supported: Homebrew (macOS), Zypper (openSUSE Linux), and Pacman (Arch Linux). Here are the installation commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;asdf

&lt;span class="c"&gt;# For Zypper (openSUSE Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;asdf

&lt;span class="c"&gt;# For Pacman (Arch Linux via AUR)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://aur.archlinux.org/asdf-vm.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;asdf-vm &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; makepkg &lt;span class="nt"&gt;-si&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ The &lt;code&gt;sudo&lt;/code&gt; command might be required depending on your system configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your operating system isn’t listed above, use the alternative method below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Downloading the &lt;em&gt;Precompiled Binary&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;This method requires &lt;code&gt;git&lt;/code&gt;, so let's make sure it’s installed by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the version appears, &lt;code&gt;git&lt;/code&gt; is already installed. If not, we’ll need to install it using our system's package manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# APT (Ubuntu Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git

&lt;span class="c"&gt;# DNF (Fedora Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;git

&lt;span class="c"&gt;# Pacman (Arch Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; git

&lt;span class="c"&gt;# Zypper (openSUSE Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;git

&lt;span class="c"&gt;# Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;coreutils git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ The &lt;code&gt;sudo&lt;/code&gt; command might be required depending on your system configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once &lt;code&gt;git&lt;/code&gt; is ready, visit the &lt;a href="https://github.com/asdf-vm/asdf/releases" rel="noopener noreferrer"&gt;&lt;code&gt;asdf&lt;/code&gt; release page on GitHub&lt;/a&gt; and download the &lt;code&gt;.tar.gz&lt;/code&gt; archive that matches our system’s architecture.&lt;/p&gt;

&lt;p&gt;We should extract the archive into one of the directories listed in the &lt;code&gt;$PATH&lt;/code&gt; environment variable. To see what directories are currently in &lt;code&gt;$PATH&lt;/code&gt;, we can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
/home/your_username/.local/bin:/usr/local/bin:/usr/bin:/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This output shows the directories separated by colons (&lt;code&gt;:&lt;/code&gt;). We can choose one of these as the extraction target:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/home/your_username/.local/bin&lt;/code&gt; - a user-owned directory, great for non-root installations.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usr/local/bin&lt;/code&gt; - commonly used for user-installed software.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usr/bin&lt;/code&gt; and &lt;code&gt;/bin&lt;/code&gt; - best avoided, as they’re part of the system core.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most recommended directory is &lt;code&gt;/home/your_username/.local/bin&lt;/code&gt; because it’s safe and doesn’t require administrative privileges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifying the Binary Location
&lt;/h3&gt;

&lt;p&gt;After extracting, let’s make sure our shell can detect &lt;code&gt;asdf&lt;/code&gt; by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; asdf
asdf is /home/your_username/.local/bin/asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the command returns the binary path, then &lt;code&gt;asdf&lt;/code&gt; is properly recognized. If not, the directory we extracted to is probably not in our &lt;code&gt;$PATH&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifying the &lt;code&gt;asdf&lt;/code&gt; Installation
&lt;/h3&gt;

&lt;p&gt;Finally, let’s run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the installation is successful, this will display the version and list of &lt;code&gt;asdf&lt;/code&gt; subcommands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw24rn0jagyjyhziav2xf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw24rn0jagyjyhziav2xf.png" alt="asdf" width="767" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now &lt;code&gt;asdf&lt;/code&gt; is ready for use. Next, we’ll install plugins for Erlang, Elixir, and Node.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Plugins in &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;asdf&lt;/code&gt; uses a plugin system to manage various runtimes. Before installing any runtime, we need to first add the corresponding plugin.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll add three plugins:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Erlang&lt;/strong&gt; - Since Elixir runs on the BEAM VM, Erlang is required for Elixir to work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elixir&lt;/strong&gt; - The main programming language we’ll be learning throughout this series.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; (optional) - Useful when managing frontend assets with the &lt;a href="https://www.phoenixframework.org/" rel="noopener noreferrer"&gt;Phoenix Framework&lt;/a&gt;, such as JavaScript and CSS.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Erlang Plugin
&lt;/h3&gt;

&lt;p&gt;The first step is to add the Erlang plugin.&lt;/p&gt;

&lt;p&gt;But before doing that, we need to make sure that all necessary system dependencies are installed. The exact list depends on the operating system we’re using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# APT (Ubuntu Linux 24.04)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;build-essential autoconf m4 libwxgtk3.2-dev libwxgtk-webview3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev unzip

&lt;span class="c"&gt;# DNF (Fedora Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;gcc g++ automake autoconf ncurses-devel wxGTK-devel wxBase openssl-devel libxslt fop unzip

&lt;span class="c"&gt;# Pacman (Arch Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nt"&gt;--needed&lt;/span&gt; base-devel ncurses glu mesa wxwidgets-gtk3 libpng libssh unixodbc libxslt fop unzip

&lt;span class="c"&gt;# Zypper (openSUSE Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;make automake autoconf gcc-c++ ncurses-devel libssh-devel libopenssl-devel wxGTK3-3_2-devel fop libxml2-tools libxslt-tools unzip

&lt;span class="c"&gt;# Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;autoconf openssl@3 wxwidgets libxslt fop unzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ The &lt;code&gt;sudo&lt;/code&gt; command may be required depending on your system configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once all dependencies are in place, we can add the Erlang plugin by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin add erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify that the plugin was added successfully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin list
erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;erlang&lt;/code&gt; appears in the list, the plugin has been added successfully.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elixir Plugin
&lt;/h3&gt;

&lt;p&gt;After adding the Erlang plugin, we can proceed to add the Elixir plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin add elixir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s verify the list of registered plugins again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin list
elixir
erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now both &lt;code&gt;elixir&lt;/code&gt; and &lt;code&gt;erlang&lt;/code&gt; are ready to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node.js Plugin (Optional)
&lt;/h3&gt;

&lt;p&gt;The Node.js plugin is optional, but very useful when developing Phoenix-based web applications, especially when dealing with frontend assets.&lt;/p&gt;

&lt;p&gt;Just like Erlang, this plugin requires a few system dependencies to be installed beforehand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# APT (Ubuntu/Debian)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gnupg curl gawk

&lt;span class="c"&gt;# DNF (Fedora/CentOS/RHEL)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gnupg2 curl gawk

&lt;span class="c"&gt;# Pacman (Arch Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; dirmngr gnupg curl gawk

&lt;span class="c"&gt;# Zypper (openSUSE)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gpg2 curl gawk

&lt;span class="c"&gt;# Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gpg curl gawk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ The &lt;code&gt;sudo&lt;/code&gt; command may be required depending on your system configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the dependencies are installed, let’s add the Node.js plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin add nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin list
elixir
erlang
nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now all the essential plugins have been installed. In the next section, we’ll install the actual runtimes through &lt;code&gt;asdf&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Runtimes in &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In this section, we’ll install the runtimes required for Elixir development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Erlang&lt;/strong&gt; - version 27.3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elixir&lt;/strong&gt; - version 1.18.3-otp-27&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; - the latest version (at the time of writing: 23.10.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since Elixir runs on the BEAM VM, we must ensure that the Elixir and Erlang versions we use are compatible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking Elixir and Erlang Compatibility
&lt;/h3&gt;

&lt;p&gt;Before we proceed, let’s confirm that the selected Elixir version is compatible with the Erlang version. This information can be found in the official Elixir documentation under the &lt;a href="https://hexdocs.pm/elixir/compatibility-and-deprecations.html#between-elixir-and-erlang-otp" rel="noopener noreferrer"&gt;Compatibility and Deprecations&lt;/a&gt; section.&lt;/p&gt;

&lt;p&gt;Here’s a snippet of the compatibility table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Elixir version&lt;/th&gt;
&lt;th&gt;Supported Erlang/OTP versions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.18&lt;/td&gt;
&lt;td&gt;25 – 27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;25 – 27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.16&lt;/td&gt;
&lt;td&gt;24 – 26&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Since we’re using Elixir 1.18.3, Erlang 27.3 is a compatible and currently stable choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking Available Versions
&lt;/h3&gt;

&lt;p&gt;Before installing, we can list available versions using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf list all erlang

&lt;span class="nv"&gt;$ &lt;/span&gt;asdf list all elixir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Erlang 27.3&lt;/strong&gt; is listed in the first output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elixir 1.18.3-otp-27&lt;/strong&gt; is listed in the second.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Node.js, we don’t need to choose a version manually since we’ll be installing the latest version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Erlang
&lt;/h3&gt;

&lt;p&gt;Install Erlang 27.3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;erlang 27.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This process will download the source code and compile it locally. The installation time depends on the speed of our machine.&lt;/p&gt;

&lt;p&gt;Set Erlang as the global default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; erlang 27.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command writes &lt;code&gt;erlang 27.3&lt;/code&gt; to the &lt;code&gt;.tool-versions&lt;/code&gt; file in our home directory, making it the default version system-wide.&lt;/p&gt;

&lt;p&gt;Verify the installation by launching the Erlang shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;erl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, we should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqcdc7sjuz3msd39wsy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqcdc7sjuz3msd39wsy1.png" alt="erl Erlang" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Elixir
&lt;/h3&gt;

&lt;p&gt;Install Elixir 1.18.3-otp-27:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;elixir 1.18.3-otp-27
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since Elixir is distributed as a precompiled binary, the installation process is relatively quick.&lt;/p&gt;

&lt;p&gt;Set Elixir as the global default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; elixir 1.18.3-otp-27
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the installation by launching the Elixir Interactive Shell (IEx):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;iex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, we should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8gf42vnmylzqu9gbxqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8gf42vnmylzqu9gbxqo.png" alt="IEx Elixir" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Node.js (Optional)
&lt;/h3&gt;

&lt;p&gt;Install the latest version of Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;nodejs latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set it as the global default (replace &lt;code&gt;23.10.0&lt;/code&gt; with the version that was installed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; nodejs 23.10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, the &lt;strong&gt;Node.js REPL&lt;/strong&gt; should appear, like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z5090kjoejzjjgfuour.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z5090kjoejzjjgfuour.png" alt="NodeJS REPL" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, all core runtimes have been successfully installed and configured. In the next section, we’ll explore how to manage global and local versions of each runtime as needed per project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing Runtime Versions in &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;After installing Erlang, Elixir, and Node.js, the next step is configuring which runtime versions to use. &lt;code&gt;asdf&lt;/code&gt; supports two configuration scopes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Global versions&lt;/strong&gt; - Applied system-wide&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local versions&lt;/strong&gt; - Applied to a specific project directory&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both approaches use the &lt;code&gt;.tool-versions&lt;/code&gt; file to store version information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Global Versions
&lt;/h3&gt;

&lt;p&gt;Global versions act as the default across the entire system unless overridden by a local configuration.&lt;/p&gt;

&lt;p&gt;In fact, when we previously ran the &lt;code&gt;asdf set --home&lt;/code&gt; commands, we already set the global versions. But if we ever want to update or reset them, here’s how:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; erlang 27.3

&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; elixir 1.18.3-otp-27

&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; nodejs 23.10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands will write entries into the &lt;code&gt;.tool-versions&lt;/code&gt; file in the &lt;code&gt;$HOME&lt;/code&gt; directory, making these runtimes globally available. The global versions are used when running commands like &lt;code&gt;erl&lt;/code&gt;, &lt;code&gt;iex&lt;/code&gt;, or &lt;code&gt;node&lt;/code&gt; from any directory, &lt;strong&gt;unless&lt;/strong&gt; that directory has its own local version configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Local Versions
&lt;/h3&gt;

&lt;p&gt;Local versions are typically defined per project and stored in a &lt;code&gt;.tool-versions&lt;/code&gt; file inside the project directory. While working within that directory (or any of its subdirectories), &lt;code&gt;asdf&lt;/code&gt; will prioritize the local versions over the global ones.&lt;/p&gt;

&lt;p&gt;To see how this works, let’s create a simple example project using &lt;code&gt;mix&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mix new hello_world

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;hello_world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll configure this &lt;code&gt;hello_world&lt;/code&gt; project to use different Erlang and Elixir versions than our global defaults:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set &lt;/span&gt;erlang 26.0

&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set &lt;/span&gt;elixir 1.17.0-otp-26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands generate a &lt;code&gt;.tool-versions&lt;/code&gt; file inside the project directory with contents like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77c3kbbsohfsyi0fyfj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77c3kbbsohfsyi0fyfj0.png" alt="Local" width="782" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install all runtime versions listed in the local &lt;code&gt;.tool-versions&lt;/code&gt; file, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command downloads and installs any versions not yet available on the system:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dr5gzt2kktu9qj0oa88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dr5gzt2kktu9qj0oa88.png" alt="asdf install" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the installation is complete, we can verify that the local versions are active by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;erl
Erlang/OTP 26 &lt;span class="o"&gt;[&lt;/span&gt;erts-14.0] ...

&lt;span class="nv"&gt;$ &lt;/span&gt;iex
iex&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt; System.version&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="s2"&gt;"1.17.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Erlang displays its version directly when the shell launches, while Elixir's version can be checked with the &lt;code&gt;System.version()&lt;/code&gt; function inside &lt;code&gt;iex&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft21hyt9pfdvsxvxe9bth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft21hyt9pfdvsxvxe9bth.png" alt="asdf local version" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The table below shows the difference between the global and local versions used in the &lt;code&gt;hello_world&lt;/code&gt; project:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Global Version&lt;/th&gt;
&lt;th&gt;Local Version (Project &lt;code&gt;hello_world&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Erlang: &lt;strong&gt;27.3&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Erlang: &lt;strong&gt;26.0&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elixir: &lt;strong&gt;1.18.3-otp-27&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Elixir: &lt;strong&gt;1.17.0-otp-26&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This approach allows us to manage multiple projects with different runtime requirements in a clean and isolated way.&lt;/p&gt;

&lt;h2&gt;
  
  
  ElixirLS - Editor Extension for Elixir Development
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🤩 Official Elixir Language Server&lt;/p&gt;

&lt;p&gt;The Elixir team is currently working on an &lt;em&gt;official Elixir Language Server&lt;/em&gt;. You can read more in &lt;a href="https://elixir-lang.org/blog/2024/08/15/welcome-elixir-language-server-team/" rel="noopener noreferrer"&gt;this announcement blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While waiting for a stable release, we’ll use &lt;strong&gt;ElixirLS&lt;/strong&gt;, a community-driven project maintained by &lt;a href="https://github.com/elixir-lsp/elixir-ls" rel="noopener noreferrer"&gt;elixir-lsp&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ElixirLS is a Language Server Protocol (LSP)-based extension that significantly improves the Elixir development experience. It provides features such as code completion, module navigation, and interactive debugging, which make development more efficient and reduce the chance of errors. This is particularly useful because Elixir is a dynamically typed language, meaning type-related issues often only appear at runtime. ElixirLS adds helpful tooling like static analysis and type annotations that can help catch potential bugs early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features of ElixirLS
&lt;/h3&gt;

&lt;p&gt;Here are the main features provided by ElixirLS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debugger&lt;/strong&gt; - Supports step-through debugging. You can run your program line by line, inspect variable values, and trace the logic directly from the editor. This is especially useful when trying to debug issues that aren’t obvious with just &lt;code&gt;IO.inspect/1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dialyzer Analysis&lt;/strong&gt; - Dialyzer is a built-in static analysis tool from Erlang that detects type mismatches and possible bugs without running the code. ElixirLS runs Dialyzer incrementally in the background, so you get faster feedback while coding without needing to trigger the full analysis manually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@spec&lt;/code&gt; Suggestions&lt;/strong&gt; - Based on Dialyzer's type inference, ElixirLS suggests type annotations (&lt;code&gt;@spec&lt;/code&gt;) for your functions. These annotations help improve documentation and make your code easier to understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Errors &amp;amp; Warnings&lt;/strong&gt; - Compilation errors and warnings, such as unused variables or incorrect argument counts, are shown directly in the editor. This removes the need to switch back and forth with the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hover Docs&lt;/strong&gt; - Hovering over a function or module name displays its documentation in a tooltip, allowing you to read docs without leaving the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go-to-Definition &amp;amp; Find References&lt;/strong&gt; - You can right-click a function or module name and choose &lt;em&gt;Go to Definition&lt;/em&gt; to jump to where it is defined. The &lt;em&gt;Find References&lt;/em&gt; feature shows all places where the function is used in your project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Completion &amp;amp; Formatter&lt;/strong&gt; - While typing, the editor suggests functions, variables, or module names that match your input. This speeds up development and reduces typos. The built-in formatter automatically formats your code to follow the official Elixir style guide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Symbol Lookup&lt;/strong&gt; - Lets you search for symbols such as functions, modules, or variables within the current file, across the project workspace, or in standard Elixir and Erlang libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features make ElixirLS an essential tool for improving code quality and developer productivity, especially when working on long-term or complex Elixir projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing ElixirLS in VS Code
&lt;/h3&gt;

&lt;p&gt;If you're using Visual Studio Code, follow these steps to install ElixirLS. For other editors, see the &lt;em&gt;IDE Plugins&lt;/em&gt; section in the &lt;a href="https://github.com/elixir-lsp/elixir-ls?tab=readme-ov-file#ide-plugins" rel="noopener noreferrer"&gt;ElixirLS README&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+Shift+X&lt;/code&gt; to open the &lt;em&gt;Extensions&lt;/em&gt; sidebar.&lt;/li&gt;
&lt;li&gt;Search for “ElixirLS”.&lt;/li&gt;
&lt;li&gt;Select the extension called &lt;strong&gt;ElixirLS: Elixir support and debugger&lt;/strong&gt; and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl92xyc8jep5156fzx6xc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl92xyc8jep5156fzx6xc.png" alt="ElixirLS" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After installation, ElixirLS will automatically build the &lt;strong&gt;PLT cache&lt;/strong&gt; the first time it runs. PLT (Persistent Lookup Table) is a database used by Dialyzer to store type information from the standard library and project dependencies. This process might take a few minutes depending on your machine, but it only needs to be done once.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6r7t8xv1ihanhd1hyu7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6r7t8xv1ihanhd1hyu7l.png" alt="ElixirLS in Action" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, we have fully set up our Elixir development environment. We’ve installed asdf, configured the appropriate runtime versions, and integrated our editor with ElixirLS.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>erlang</category>
      <category>node</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Mempersiapkan Lingkungan Pengembangan Elixir</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 18 Jun 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/mempersiapkan-lingkungan-pengembangan-elixir-247</link>
      <guid>https://dev.to/muzhawir/mempersiapkan-lingkungan-pengembangan-elixir-247</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📜 You can read the English version &lt;a href="https://dev.to/muzhawir/preparing-the-elixir-development-environment-39ep"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Daftar Isi
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;
Apa itu &lt;code&gt;asdf&lt;/code&gt; &lt;em&gt;version manager&lt;/em&gt;?

&lt;ul&gt;
&lt;li&gt;Mengapa Memilih &lt;code&gt;asdf&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Instalasi &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Menggunakan &lt;em&gt;Package Manager&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Mengunduh &lt;em&gt;Precompiled Binary&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Verifikasi Lokasi &lt;em&gt;Binary&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Verifikasi Instalasi &lt;code&gt;asdf&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Instalasi Plugin di &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Plugin Erlang&lt;/li&gt;
&lt;li&gt;Plugin Elixir&lt;/li&gt;
&lt;li&gt;Plugin Node.js (Opsional)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Instalasi &lt;em&gt;Runtime&lt;/em&gt; di &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Memeriksa Kompatibilitas Elixir dan Erlang&lt;/li&gt;
&lt;li&gt;Memeriksa Versi yang Tersedia&lt;/li&gt;
&lt;li&gt;Instalasi Erlang&lt;/li&gt;
&lt;li&gt;Instalasi Elixir&lt;/li&gt;
&lt;li&gt;Instalasi Node.js (Opsional)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Mengatur Versi &lt;em&gt;Runtime&lt;/em&gt; di &lt;code&gt;asdf&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Mengatur Versi Global&lt;/li&gt;
&lt;li&gt;Mengatur Versi Lokal&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

ElixirLS - Ekstensi Editor untuk Pengembangan Elixir

&lt;ul&gt;
&lt;li&gt;Fitur Unggulan ElixirLS&lt;/li&gt;
&lt;li&gt;Instalasi ElixirLS di VS Code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;



&lt;h2&gt;
  
  
  Apa itu &lt;code&gt;asdf&lt;/code&gt; &lt;em&gt;version manager&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8gs53351mvmtmlvl0v4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8gs53351mvmtmlvl0v4.png" alt="asdf banner" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Erlang dan Elixir bisa diinstal langsung lewat panduan pada &lt;a href="https://www.erlang.org/downloads#prebuilt" rel="noopener noreferrer"&gt;halaman unduh Erlang/OTP&lt;/a&gt; dan &lt;a href="https://elixir-lang.org/install.html#by-operating-system" rel="noopener noreferrer"&gt;situs resmi Elixir&lt;/a&gt;. Namun, pendekatan ini memiliki keterbatasan dalam konteks pengembangan: sistem hanya bisa menangani satu versi &lt;em&gt;runtime&lt;/em&gt; dalam satu waktu. Jika kita ingin menggunakan versi lain, besar kemungkinan akan terjadi konflik atau sistem meminta kita menimpa versi yang sudah terinstal.&lt;/p&gt;

&lt;p&gt;Untuk mengatasi hal ini, kita bisa menggunakan &lt;em&gt;version manager&lt;/em&gt;, yaitu alat yang memungkinkan kita menginstal dan mengelola banyak versi &lt;em&gt;runtime&lt;/em&gt; secara berdampingan dalam satu sistem. Pendekatan ini memungkinkan kita mendukung berbagai proyek dengan versi &lt;em&gt;runtime&lt;/em&gt; berbeda dan berpindah antarversi sesuai kebutuhan.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Version manager&lt;/em&gt; juga membantu menjaga konsistensi lingkungan pengembangan dalam satu tim, karena seluruh anggota bisa menggunakan versi yang sama dan terhindar dari masalah kompatibilitas.&lt;/p&gt;

&lt;p&gt;Dalam tulisan ini, kita akan menggunakan &lt;em&gt;version manager&lt;/em&gt; bernama &lt;a href="https://asdf-vm.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;asdf-vm&lt;/strong&gt;&lt;/a&gt;, atau cukup disebut &lt;strong&gt;asdf&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa Memilih &lt;code&gt;asdf&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Dalam proyek perangkat lunak modern, kita sering membutuhkan lebih dari satu &lt;em&gt;runtime&lt;/em&gt;, yang berarti juga membutuhkan beberapa &lt;em&gt;version manager&lt;/em&gt; untuk mengelolanya. Misalnya, untuk mengembangkan aplikasi web berbasis Elixir, kita mungkin menggunakan &lt;code&gt;kerl&lt;/code&gt; untuk Erlang, &lt;code&gt;kiex&lt;/code&gt; untuk Elixir, dan &lt;code&gt;nvm&lt;/code&gt; untuk Node.js. Jika setiap &lt;em&gt;runtime&lt;/em&gt; dikelola dengan alat yang berbeda, pengelolaan lingkungan menjadi rumit dan menambah beban kognitif.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;asdf&lt;/code&gt; menyederhanakan ini dengan menyediakan satu antarmuka terpadu untuk mengelola berbagai &lt;em&gt;runtime&lt;/em&gt; melalui sistem &lt;em&gt;plugin&lt;/em&gt;. Dengan &lt;code&gt;asdf&lt;/code&gt;, kita bisa menginstal dan beralih antarversi Erlang, Elixir, Node.js, dan puluhan &lt;em&gt;runtime&lt;/em&gt; lainnya hanya dengan satu alat dan pola perintah yang konsisten.&lt;/p&gt;

&lt;p&gt;Beberapa keunggulan utama &lt;code&gt;asdf&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antarmuka seragam&lt;/strong&gt;. Kita tidak perlu mempelajari cara kerja berbeda untuk tiap &lt;em&gt;version manager&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dukungan plugin yang luas&lt;/strong&gt;, termasuk plugin resmi (&lt;em&gt;first-party&lt;/em&gt;) untuk Erlang dan Elixir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Konsistensi lintas proyek dan tim&lt;/strong&gt;, melalui file &lt;code&gt;.tool-versions&lt;/code&gt; yang mendeklarasikan versi setiap &lt;em&gt;runtime&lt;/em&gt; secara eksplisit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saat ini tersedia hampir 100 &lt;a href="https://github.com/asdf-community" rel="noopener noreferrer"&gt;plugin&lt;/a&gt; yang dikembangkan oleh komunitas. Karena plugin untuk Erlang dan Elixir dikembangkan secara resmi, &lt;code&gt;asdf&lt;/code&gt; menjadi pilihan yang sangat direkomendasikan untuk pengembangan proyek Elixir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Untuk menginstal &lt;code&gt;asdf&lt;/code&gt;, tersedia dua metode utama: pertama, melalui &lt;em&gt;package manager&lt;/em&gt;, dan kedua, dengan mengunduh &lt;em&gt;precompiled binary&lt;/em&gt; dari GitHub. Metode lain seperti &lt;code&gt;go install&lt;/code&gt; atau membangun langsung dari &lt;em&gt;source code&lt;/em&gt; juga tersedia, tetapi tidak akan dibahas di sini. Jika ingin mengeksplorasi metode lain, silakan merujuk ke dokumentasi resmi di &lt;a href="https://asdf-vm.com/guide/getting-started.html#_1-install-asdf" rel="noopener noreferrer"&gt;halaman ini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kita mulai dari metode pertama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Menggunakan &lt;em&gt;Package Manager&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Ini adalah metode yang direkomendasikan oleh pengembang &lt;code&gt;asdf&lt;/code&gt;. Saat ini terdapat tiga &lt;em&gt;package manager&lt;/em&gt; yang didukung secara langsung: Homebrew (macOS), Zypper (openSUSE Linux), dan Pacman (Arch Linux). Berikut adalah perintah instalasinya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Untuk Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;asdf

&lt;span class="c"&gt;# Untuk Zypper (openSUSE Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;asdf

&lt;span class="c"&gt;# Untuk Pacman (Arch Linux via AUR)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://aur.archlinux.org/asdf-vm.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;asdf-vm &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; makepkg &lt;span class="nt"&gt;-si&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Perintah &lt;code&gt;sudo&lt;/code&gt; mungkin diperlukan tergantung pada konfigurasi sistem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jika sistem operasi yang digunakan tidak termasuk dalam daftar di atas, metode berikut bisa digunakan sebagai alternatif.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengunduh &lt;em&gt;Precompiled Binary&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Metode ini memerlukan &lt;code&gt;git&lt;/code&gt;, jadi pastikan &lt;code&gt;git&lt;/code&gt; sudah terinstal dengan menjalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika versi &lt;code&gt;git&lt;/code&gt; ditampilkan, artinya sudah terinstal. Jika belum, instal terlebih dahulu sesuai sistem operasi yang digunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# APT (Ubuntu Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git

&lt;span class="c"&gt;# DNF (Fedora Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;git

&lt;span class="c"&gt;# Pacman (Arch Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; git

&lt;span class="c"&gt;# Zypper (openSUSE Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;git

&lt;span class="c"&gt;# Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;coreutils git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Perintah &lt;code&gt;sudo&lt;/code&gt; mungkin diperlukan tergantung pada konfigurasi sistem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setelah &lt;code&gt;git&lt;/code&gt; tersedia, buka &lt;a href="https://github.com/asdf-vm/asdf/releases" rel="noopener noreferrer"&gt;halaman rilis asdf di GitHub&lt;/a&gt; dan unduh arsip &lt;code&gt;.tar.gz&lt;/code&gt; yang sesuai dengan arsitektur sistem.&lt;/p&gt;

&lt;p&gt;Ekstrak arsip tersebut ke dalam salah satu direktori yang tercantum di dalam &lt;em&gt;environment variable&lt;/em&gt; &lt;code&gt;$PATH&lt;/code&gt;. Untuk melihat daftar direktori dalam &lt;code&gt;$PATH&lt;/code&gt;, jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
/home/nama_user_kamu/.local/bin:/usr/local/bin:/usr/bin:/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output di atas berisi direktori yang dipisahkan dengan tanda titik dua &lt;code&gt;:&lt;/code&gt;. Pilih salah satu direktori berikut sebagai target ekstraksi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/home/nama_user_kamu/.local/bin&lt;/code&gt; - direktori milik pengguna, cocok untuk instalasi tanpa akses &lt;em&gt;root&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usr/local/bin&lt;/code&gt; - umum digunakan untuk perangkat lunak tambahan.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usr/bin&lt;/code&gt; dan &lt;code&gt;/bin&lt;/code&gt; - sebaiknya dihindari karena merupakan bagian dari sistem inti.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Direktori yang paling direkomendasikan adalah &lt;code&gt;/home/nama_user_kamu/.local/bin&lt;/code&gt; karena aman dan tidak memerlukan hak akses administratif.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifikasi Lokasi &lt;em&gt;Binary&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Setelah mengekstrak, pastikan &lt;code&gt;asdf&lt;/code&gt; dikenali oleh &lt;em&gt;shell&lt;/em&gt; dengan menjalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; asdf
asdf is /home/nama_user_kamu/.local/bin/asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika perintah di atas menampilkan lokasi binary &lt;code&gt;asdf&lt;/code&gt;, berarti sudah terdeteksi dengan benar. Jika tidak, kemungkinan besar direktori tempat ekstraksi belum terdaftar dalam &lt;code&gt;$PATH&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifikasi Instalasi &lt;code&gt;asdf&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Terakhir, jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika instalasi berhasil, perintah ini akan menampilkan informasi versi dan daftar subperintah &lt;code&gt;asdf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw24rn0jagyjyhziav2xf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw24rn0jagyjyhziav2xf.png" alt="asdf" width="767" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sekarang &lt;code&gt;asdf&lt;/code&gt; sudah siap digunakan. Selanjutnya, kita akan menginstal &lt;em&gt;plugin&lt;/em&gt; untuk Erlang, Elixir, dan Node.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi Plugin di &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;asdf&lt;/code&gt; menggunakan sistem &lt;em&gt;plugin&lt;/em&gt; untuk mengelola berbagai &lt;em&gt;runtime&lt;/em&gt;. Sebelum menginstal &lt;em&gt;runtime&lt;/em&gt;, kita perlu menambahkan &lt;em&gt;plugin&lt;/em&gt; yang sesuai terlebih dahulu.&lt;/p&gt;

&lt;p&gt;Dalam tulisan ini, kita akan menambahkan tiga &lt;em&gt;plugin&lt;/em&gt; utama:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Erlang&lt;/strong&gt; – Karena Elixir berjalan di atas BEAM VM, maka Erlang dibutuhkan agar Elixir bisa berfungsi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elixir&lt;/strong&gt; – Bahasa pemrograman utama yang akan kita pelajari dalam seri ini.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; (opsional) – Diperlukan saat kita mengelola aset &lt;em&gt;frontend&lt;/em&gt; dengan &lt;a href="https://www.phoenixframework.org/" rel="noopener noreferrer"&gt;Phoenix Framework&lt;/a&gt;, seperti JavaScript dan CSS.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Plugin Erlang
&lt;/h3&gt;

&lt;p&gt;Langkah pertama adalah menambahkan &lt;em&gt;plugin&lt;/em&gt; untuk Erlang.&lt;/p&gt;

&lt;p&gt;Namun sebelum itu, kita perlu memastikan seluruh dependensi sistem sudah terinstal. Daftar berikut menyesuaikan dengan sistem operasi yang digunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# APT (Ubuntu Linux 24.04)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;build-essential autoconf m4 libwxgtk3.2-dev libwxgtk-webview3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev unzip

&lt;span class="c"&gt;# DNF (Fedora Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;gcc g++ automake autoconf ncurses-devel wxGTK-devel wxBase openssl-devel libxslt fop unzip

&lt;span class="c"&gt;# Pacman (Arch Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nt"&gt;--needed&lt;/span&gt; base-devel ncurses glu mesa wxwidgets-gtk3 libpng libssh unixodbc libxslt fop unzip

&lt;span class="c"&gt;# Zypper (openSUSE Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;make automake autoconf gcc-c++ ncurses-devel libssh-devel libopenssl-devel wxGTK3-3_2-devel fop libxml2-tools libxslt-tools unzip

&lt;span class="c"&gt;# Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;autoconf openssl@3 wxwidgets libxslt fop unzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Perintah &lt;code&gt;sudo&lt;/code&gt; mungkin diperlukan tergantung pada konfigurasi sistem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setelah semua dependensi terinstal, tambahkan &lt;em&gt;plugin&lt;/em&gt; Erlang dengan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin add erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu verifikasi bahwa plugin berhasil ditambahkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin list
erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika &lt;code&gt;erlang&lt;/code&gt; muncul dalam daftar, berarti &lt;em&gt;plugin&lt;/em&gt; telah berhasil ditambahkan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugin Elixir
&lt;/h3&gt;

&lt;p&gt;Setelah plugin Erlang ditambahkan, kita bisa lanjut menambahkan &lt;em&gt;plugin&lt;/em&gt; Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin add elixir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi kembali daftar &lt;em&gt;plugin&lt;/em&gt; yang sudah terdaftar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin list
elixir
erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan begitu, &lt;code&gt;elixir&lt;/code&gt; dan &lt;code&gt;erlang&lt;/code&gt; kini siap digunakan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugin Node.js (Opsional)
&lt;/h3&gt;

&lt;p&gt;Plugin untuk Node.js bersifat opsional, tetapi sangat berguna dalam pengembangan aplikasi web menggunakan Phoenix, terutama ketika berurusan dengan aset &lt;em&gt;frontend&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Seperti Erlang, plugin ini juga memerlukan beberapa dependensi awal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# APT (Ubuntu/Debian)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gnupg curl gawk

&lt;span class="c"&gt;# DNF (Fedora/CentOS/RHEL)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gnupg2 curl gawk

&lt;span class="c"&gt;# Pacman (Arch Linux)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; dirmngr gnupg curl gawk

&lt;span class="c"&gt;# Zypper (openSUSE)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;zypper &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gpg2 curl gawk

&lt;span class="c"&gt;# Homebrew (macOS)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;dirmngr gpg curl gawk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Perintah &lt;code&gt;sudo&lt;/code&gt; mungkin diperlukan tergantung pada konfigurasi sistem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setelah semua dependensi terinstal, tambahkan &lt;em&gt;plugin&lt;/em&gt; Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin add nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu verifikasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf plugin list
elixir
erlang
nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kini semua &lt;em&gt;plugin&lt;/em&gt; utama sudah terinstal. Tahap berikutnya adalah menginstal masing-masing &lt;em&gt;runtime&lt;/em&gt; melalui &lt;code&gt;asdf&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi &lt;em&gt;Runtime&lt;/em&gt; di &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Pada bagian ini, kita akan menginstal &lt;em&gt;runtime&lt;/em&gt; utama yang dibutuhkan untuk pengembangan dengan Elixir, yaitu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Erlang&lt;/strong&gt; - versi 27.3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elixir&lt;/strong&gt; - versi 1.18.3-otp-27&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; - versi terbaru (saat tulisan ini dibuat: 23.10.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Karena Elixir berjalan di atas BEAM VM, kita perlu memastikan versi Elixir dan Erlang yang digunakan saling kompatibel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memeriksa Kompatibilitas Elixir dan Erlang
&lt;/h3&gt;

&lt;p&gt;Sebelum memulai instalasi, pastikan versi Elixir yang dipilih kompatibel dengan versi Erlang. Informasi ini tersedia di dokumentasi resmi Elixir pada bagian &lt;a href="https://hexdocs.pm/elixir/compatibility-and-deprecations.html#between-elixir-and-erlang-otp" rel="noopener noreferrer"&gt;Compatibility and Deprecations&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Berikut cuplikan tabel kompatibilitasnya:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Elixir version&lt;/th&gt;
&lt;th&gt;Supported Erlang/OTP versions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.18&lt;/td&gt;
&lt;td&gt;25 – 27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.17&lt;/td&gt;
&lt;td&gt;25 – 27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.16&lt;/td&gt;
&lt;td&gt;24 – 26&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Karena kita akan menggunakan Elixir 1.18.3, maka Erlang 27.3 adalah versi yang kompatibel dan juga merupakan versi stabil terbaru saat ini.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memeriksa Versi yang Tersedia
&lt;/h3&gt;

&lt;p&gt;Sebelum menginstal, kita bisa memeriksa versi-versi yang tersedia dengan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf list all erlang

&lt;span class="nv"&gt;$ &lt;/span&gt;asdf list all elixir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pastikan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Erlang 27.3&lt;/strong&gt; tersedia di daftar pertama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elixir 1.18.3-otp-27&lt;/strong&gt; tersedia di daftar kedua.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk Node.js, kita tidak perlu memilih versi secara manual karena akan langsung menginstal versi terbaru.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi Erlang
&lt;/h3&gt;

&lt;p&gt;Instal Erlang 27.3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;erlang 27.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Proses ini akan mengunduh &lt;em&gt;source code&lt;/em&gt; dan mengkompilasinya secara lokal. Waktu instalasi tergantung pada kecepatan mesin.&lt;/p&gt;

&lt;p&gt;Set versi global Erlang:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; erlang 27.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan menulis &lt;code&gt;erlang 27.3&lt;/code&gt; ke dalam file &lt;code&gt;.tool-versions&lt;/code&gt; di direktori &lt;em&gt;home&lt;/em&gt;, sehingga versi ini digunakan secara &lt;em&gt;default&lt;/em&gt; di seluruh sistem.&lt;/p&gt;

&lt;p&gt;Verifikasi instalasi dengan membuka &lt;em&gt;Erlang shell&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;erl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika berhasil, akan muncul seperti ini:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqcdc7sjuz3msd39wsy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqcdc7sjuz3msd39wsy1.png" alt="erl Erlang" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi Elixir
&lt;/h3&gt;

&lt;p&gt;Instal Elixir 1.18.3-otp-27:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;elixir 1.18.3-otp-27
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena Elixir tersedia dalam bentuk &lt;em&gt;precompiled binary&lt;/em&gt;, proses instalasinya relatif cepat.&lt;/p&gt;

&lt;p&gt;Set versi global Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; elixir 1.18.3-otp-27
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi dengan membuka &lt;em&gt;Elixir Interactive Shell (IEx)&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;iex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika berhasil, akan muncul seperti ini:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8gf42vnmylzqu9gbxqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8gf42vnmylzqu9gbxqo.png" alt="IEx Elixir" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi Node.js (Opsional)
&lt;/h3&gt;

&lt;p&gt;Instal versi terbaru dari Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install &lt;/span&gt;nodejs latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set versi global (gantilah &lt;code&gt;23.10.0&lt;/code&gt; sesuai versi yang terinstal):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; nodejs 23.10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi instalasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika berhasil, akan muncul tampilan &lt;strong&gt;Node.js REPL&lt;/strong&gt; seperti berikut:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z5090kjoejzjjgfuour.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z5090kjoejzjjgfuour.png" alt="NodeJS REPL" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dengan langkah ini, semua &lt;em&gt;runtime&lt;/em&gt; utama sudah berhasil diinstal dan dikonfigurasi. Di bagian selanjutnya, kita akan membahas bagaimana mengelola versi &lt;em&gt;runtime&lt;/em&gt; secara global dan lokal sesuai kebutuhan proyek.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengatur Versi &lt;em&gt;Runtime&lt;/em&gt; di &lt;code&gt;asdf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Setelah menginstal Erlang, Elixir, dan Node.js, langkah selanjutnya adalah mengatur versi &lt;em&gt;runtime&lt;/em&gt; yang akan digunakan. &lt;code&gt;asdf&lt;/code&gt; mendukung dua skema pengaturan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Versi global&lt;/strong&gt; – Berlaku di seluruh sistem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versi lokal&lt;/strong&gt; – Berlaku khusus di dalam direktori proyek.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kedua pendekatan ini menggunakan file &lt;code&gt;.tool-versions&lt;/code&gt; untuk menyimpan informasi versi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengatur Versi Global
&lt;/h3&gt;

&lt;p&gt;Versi global digunakan sebagai &lt;em&gt;default&lt;/em&gt; di seluruh sistem, kecuali jika direktori tempat kita berada memiliki konfigurasi lokal.&lt;/p&gt;

&lt;p&gt;Sebenarnya, saat sebelumnya kita menjalankan perintah &lt;code&gt;asdf set --home&lt;/code&gt;, kita sudah mengatur versi global. Namun, jika ingin mengubah atau mengatur ulangnya, berikut contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; erlang 27.3

&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; elixir 1.18.3-otp-27

&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--home&lt;/span&gt; nodejs 23.10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah-perintah ini akan menuliskan entri ke dalam file &lt;code&gt;.tool-versions&lt;/code&gt; di direktori &lt;code&gt;$HOME&lt;/code&gt;, sehingga &lt;em&gt;runtime&lt;/em&gt; ini berlaku secara global. Versi global ini akan digunakan saat kita menjalankan perintah seperti &lt;code&gt;erl&lt;/code&gt;, &lt;code&gt;iex&lt;/code&gt;, atau &lt;code&gt;node&lt;/code&gt; dari direktori mana pun, &lt;strong&gt;kecuali&lt;/strong&gt; jika direktori tersebut memiliki versi lokalnya sendiri.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengatur Versi Lokal
&lt;/h3&gt;

&lt;p&gt;Versi lokal biasanya diterapkan di direktori proyek dan disimpan dalam file &lt;code&gt;.tool-versions&lt;/code&gt;. Selama kita berada di dalam direktori proyek (atau subdirektorinya), &lt;code&gt;asdf&lt;/code&gt; akan memprioritaskan versi lokal dibanding versi global.&lt;/p&gt;

&lt;p&gt;Untuk memahami cara kerjanya, mari kita buat contoh proyek sederhana menggunakan &lt;em&gt;mix&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mix new hello_world
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;hello_world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita ingin agar proyek &lt;code&gt;hello_world&lt;/code&gt; menggunakan versi Erlang dan Elixir yang berbeda dari versi global, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set &lt;/span&gt;erlang 26.0
&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;set &lt;/span&gt;elixir 1.17.0-otp-26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan menghasilkan file &lt;code&gt;.tool-versions&lt;/code&gt; di dalam direktori proyek dengan isi seperti berikut:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77c3kbbsohfsyi0fyfj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77c3kbbsohfsyi0fyfj0.png" alt="Local" width="782" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Untuk menginstal semua versi &lt;em&gt;runtime&lt;/em&gt; yang tercantum dalam file &lt;code&gt;.tool-versions&lt;/code&gt; lokal, jalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;asdf &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan mengunduh dan menginstal versi-versi yang belum tersedia di sistem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dr5gzt2kktu9qj0oa88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dr5gzt2kktu9qj0oa88.png" alt="asdf install" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah instalasi selesai, kita bisa memastikan bahwa versi lokal sudah aktif dengan menjalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;erl
Erlang/OTP 26 &lt;span class="o"&gt;[&lt;/span&gt;erts-14.0] ...

&lt;span class="nv"&gt;$ &lt;/span&gt;iex
iex&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt; System.version&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="s2"&gt;"1.17.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Versi Erlang ditampilkan langsung saat &lt;em&gt;shell&lt;/em&gt; terbuka, sedangkan versi Elixir dapat dicek dengan memanggil &lt;em&gt;function&lt;/em&gt; &lt;code&gt;System.version()&lt;/code&gt; di dalam &lt;code&gt;iex&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft21hyt9pfdvsxvxe9bth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft21hyt9pfdvsxvxe9bth.png" alt="asdf local version" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabel berikut menunjukkan perbedaan antara versi global dan versi lokal yang digunakan di proyek &lt;code&gt;hello_world&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Versi Global&lt;/th&gt;
&lt;th&gt;Versi Lokal (Proyek &lt;code&gt;hello_world&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Erlang: &lt;strong&gt;27.3&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Erlang: &lt;strong&gt;26.0&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elixir: &lt;strong&gt;1.18.3-otp-27&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Elixir: &lt;strong&gt;1.17.0-otp-26&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dengan cara ini, kita bisa mengelola banyak proyek dengan kebutuhan versi &lt;em&gt;runtime&lt;/em&gt; yang berbeda-beda secara bersih dan terisolasi.&lt;/p&gt;

&lt;h2&gt;
  
  
  ElixirLS - Ekstensi Editor untuk Pengembangan Elixir
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🤩 Elixir Language Server Resmi&lt;/p&gt;

&lt;p&gt;Tim pengembang Elixir sedang mengembangkan &lt;em&gt;official Elixir Language Server&lt;/em&gt;. Detailnya bisa dibaca di &lt;a href="https://elixir-lang.org/blog/2024/08/15/welcome-elixir-language-server-team/" rel="noopener noreferrer"&gt;pengumuman blog ini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sambil menunggu rilis stabilnya, kita akan menggunakan &lt;strong&gt;ElixirLS&lt;/strong&gt;, yaitu proyek komunitas dari &lt;a href="https://github.com/elixir-lsp/elixir-ls" rel="noopener noreferrer"&gt;elixir-lsp&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ElixirLS adalah ekstensi editor berbasis &lt;em&gt;Language Server Protocol (LSP)&lt;/em&gt; yang membantu proses penulisan kode Elixir. Fitur-fitur seperti &lt;em&gt;code completion&lt;/em&gt;, navigasi antar &lt;em&gt;module&lt;/em&gt;, hingga &lt;em&gt;debugging&lt;/em&gt; interaktif membuat proses pengembangan menjadi lebih efisien dan minim kesalahan, terutama karena Elixir adalah bahasa dengan &lt;em&gt;dynamic typing&lt;/em&gt;, sehingga kesalahan tipe baru terlihat saat &lt;em&gt;runtime&lt;/em&gt;. ElixirLS menambahkan lapisan bantuan seperti analisis statis dan anotasi tipe untuk mengurangi potensi &lt;em&gt;bug&lt;/em&gt; sejak dini.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fitur ElixirLS
&lt;/h3&gt;

&lt;p&gt;Berikut fitur-fitur utama ElixirLS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debugger&lt;/strong&gt; - mendukung &lt;em&gt;step-through debugging&lt;/em&gt;, kita bisa menjalankan program baris demi baris, melihat isi variabel, dan menelusuri alur logika secara langsung dari editor. Ini sangat berguna saat mencari &lt;em&gt;bug&lt;/em&gt; yang tidak mudah dilihat hanya dengan &lt;em&gt;function&lt;/em&gt; &lt;code&gt;IO.inspect/1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dialyzer Analysis&lt;/strong&gt; - Dialyzer adalah alat analisis statis bawaan Erlang yang mendeteksi ketidaksesuaian tipe dan potensi &lt;em&gt;bug&lt;/em&gt; tanpa menjalankan kode. ElixirLS menjalankan analisis ini secara otomatis dan bertahap (&lt;em&gt;incremental&lt;/em&gt;), sehingga kita mendapat umpan balik cepat saat menulis kode tanpa harus menjalankan seluruh analisis manual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@spec&lt;/code&gt; Suggestions&lt;/strong&gt; - berdasarkan hasil inferensi dari Dialyzer, ElixirLS akan menyarankan anotasi tipe (&lt;code&gt;@spec&lt;/code&gt;) untuk &lt;em&gt;function-function&lt;/em&gt; yang kita tulis. Ini membantu dokumentasi dan meningkatkan kejelasan kode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Errors &amp;amp; Warnings&lt;/strong&gt; - kesalahan kompilasi dan peringatan seperti variabel tidak terpakai atau argumen salah langsung ditampilkan di dalam editor, tanpa harus bolak-balik ke &lt;em&gt;terminal&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hover Docs&lt;/strong&gt; - saat kursor diarahkan ke nama &lt;em&gt;function&lt;/em&gt; atau &lt;em&gt;module&lt;/em&gt;, dokumentasi singkatnya akan muncul sebagai &lt;em&gt;tooltip&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go-to-Definition &amp;amp; Find References&lt;/strong&gt; - klik kanan pada nama &lt;em&gt;function&lt;/em&gt; atau &lt;em&gt;module&lt;/em&gt; dan pilih &lt;em&gt;Go to Definition&lt;/em&gt; untuk langsung melompat ke tempat &lt;em&gt;function&lt;/em&gt; tersebut didefinisikan. Sebaliknya, &lt;em&gt;Find References&lt;/em&gt; akan menunjukkan di mana saja &lt;em&gt;function&lt;/em&gt; tersebut dipanggil di dalam proyek.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Completion &amp;amp; Formatter&lt;/strong&gt; - saat mengetik, editor akan menyarankan nama &lt;em&gt;function&lt;/em&gt;, variabel, atau &lt;em&gt;module&lt;/em&gt; yang cocok. Ini mempercepat penulisan dan mengurangi &lt;em&gt;typo&lt;/em&gt;. Sementara &lt;em&gt;formatter&lt;/em&gt; akan memformat kode kita secara otomatis mengikuti gaya penulisan resmi komunitas Elixir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Symbol Lookup&lt;/strong&gt; - memungkinkan pencarian simbol seperti &lt;em&gt;function&lt;/em&gt;, &lt;em&gt;module&lt;/em&gt;, atau variabel di file aktif, seluruh proyek (&lt;em&gt;workspace&lt;/em&gt;), maupun pustaka standar Elixir/Erlang.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan semua fitur ini, ElixirLS menjadi alat penting untuk meningkatkan kualitas dan kenyamanan kerja saat menulis kode Elixir, terutama untuk proyek-proyek jangka panjang dan kompleks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalasi ElixirLS di VS Code
&lt;/h3&gt;

&lt;p&gt;Untuk pengguna VS Code, berikut langkah-langkah instalasinya. Jika kamu menggunakan editor lain, lihat daftar &lt;em&gt;plugin&lt;/em&gt; yang tersedia di bagian &lt;em&gt;IDE Plugins&lt;/em&gt; pada &lt;a href="https://github.com/elixir-lsp/elixir-ls?tab=readme-ov-file#ide-plugins" rel="noopener noreferrer"&gt;README ElixirLS&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tekan &lt;code&gt;Ctrl+Shift+X&lt;/code&gt; untuk membuka &lt;em&gt;Extensions&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Ketik “ElixirLS” pada kolom pencarian.&lt;/li&gt;
&lt;li&gt;Pilih ekstensi dengan nama &lt;strong&gt;ElixirLS: Elixir support and debugger&lt;/strong&gt;, lalu klik &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl92xyc8jep5156fzx6xc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl92xyc8jep5156fzx6xc.png" alt="ElixirLS" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah instalasi selesai, ElixirLS akan secara otomatis membangun &lt;strong&gt;PLT cache&lt;/strong&gt; saat pertama kali digunakan. PLT (&lt;em&gt;Persistent Lookup Table&lt;/em&gt;) adalah basis data yang digunakan Dialyzer untuk menyimpan informasi tipe dari pustaka standar dan dependensi proyek. Proses ini bisa memakan waktu beberapa menit tergantung spesifikasi mesin, tapi hanya perlu dilakukan sekali.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6r7t8xv1ihanhd1hyu7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6r7t8xv1ihanhd1hyu7l.png" alt="ElixirLS in Action" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dengan ini, kita telah menyelesaikan seluruh tahapan &lt;em&gt;setup&lt;/em&gt; lingkungan pengembangan Elixir: mulai dari instalasi &lt;code&gt;asdf&lt;/code&gt;, pengelolaan versi &lt;em&gt;runtime&lt;/em&gt;, hingga integrasi editor menggunakan ElixirLS.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>erlang</category>
      <category>node</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Getting to Know Elixir Programming Language</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 11 Jun 2025 18:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/getting-to-know-elixir-programming-language-5ek9</link>
      <guid>https://dev.to/muzhawir/getting-to-know-elixir-programming-language-5ek9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📜 You can read the Indonesian version &lt;a href="https://dev.to/muzhawir/berkenalan-dengan-bahasa-pemrograman-elixir-ne9"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;Elixir Language&lt;/li&gt;
&lt;li&gt;Improvements Brought by Elixir&lt;/li&gt;
&lt;li&gt;
Elixir’s Drawbacks

&lt;ul&gt;
&lt;li&gt;Performance: Not for Raw Speed&lt;/li&gt;
&lt;li&gt;Ecosystem: Still Smaller Than Popular Languages&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Learning Resources for Elixir&lt;/li&gt;

&lt;li&gt;References&lt;/li&gt;

&lt;/ul&gt;



&lt;h2&gt;
  
  
  Elixir Language
&lt;/h2&gt;

&lt;p&gt;If Erlang is already very capable, why do we still need to learn Elixir?&lt;/p&gt;

&lt;p&gt;The answer lies in the improvements Elixir brings to the developer experience and overall productivity.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/R7t7zca8SyM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Elixir is a functional programming language designed to help us write cleaner, more concise, and more expressive code on the BEAM virtual machine. With its modern syntax and a design focused on developer comfort, Elixir makes it easier for us to read, maintain, and develop applications.&lt;/p&gt;

&lt;p&gt;Elixir code is compiled into bytecode that runs on the BEAM virtual machine, just like Erlang. Since it’s built on the same foundation, Elixir is fully compatible with the existing ecosystem. We can use Erlang libraries directly in Elixir projects, and vice versa. This is very helpful when the library we need doesn’t yet exist in Elixir, allowing us to use mature solutions without having to rewrite them from scratch.&lt;/p&gt;

&lt;p&gt;But Elixir is not just about compatibility. It simplifies many aspects of writing Erlang code. Elixir reduces repetitive code and offers modern tools such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mix&lt;/strong&gt; for project management, testing, and compilation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hex&lt;/strong&gt; as the official package manager for the Elixir ecosystem&lt;/li&gt;
&lt;li&gt;Built-in documentation, automated testing, and debugging utilities that support modern development workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With all these advantages, Elixir brings the power and reliability of Erlang in a more developer-friendly form, including for beginners like us who are just getting started with the ecosystem. This makes Elixir an attractive option for anyone who wants to build large-scale, fault-tolerant systems on top of the BEAM.&lt;/p&gt;

&lt;p&gt;Just like Erlang, Elixir is an actively developed open-source project. It was created by &lt;a href="https://github.com/josevalim" rel="noopener noreferrer"&gt;José Valim&lt;/a&gt;, and its source code is available in the &lt;a href="https://github.com/elixir-lang/elixir" rel="noopener noreferrer"&gt;elixir-lang/elixir&lt;/a&gt; GitHub repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improvements Brought by Elixir
&lt;/h2&gt;

&lt;p&gt;One of Elixir’s biggest strengths is its ability to significantly reduce boilerplate and syntactic noise. Code written in Elixir tends to be simpler, more expressive, and easier to maintain.&lt;/p&gt;

&lt;p&gt;In Erlang, boilerplate is often unavoidable due to syntax limitations. Elixir solves this by introducing various forms of syntactic sugar and modern writing styles that make the code more pleasant to read and write.&lt;/p&gt;

&lt;p&gt;Even though both Erlang and Elixir are functional languages focused on data transformation through functions, the way we structure program flow in Elixir feels much more natural. One of the most noticeable differences lies in how we chain function calls. In Erlang, data is usually processed in a nested manner from the inside out, a style often called "&lt;em&gt;staircasing&lt;/em&gt;." When many functions are used in sequence, the code becomes hard to read, especially for beginners.&lt;/p&gt;

&lt;p&gt;Elixir simplifies this pattern by introducing the pipe operator (&lt;code&gt;|&amp;gt;&lt;/code&gt;). This operator allows us to write data flow from left to right, or top to bottom, following the actual order of execution. The result is more readable code that flows logically.&lt;/p&gt;

&lt;p&gt;Here’s a comparison:&lt;/p&gt;

&lt;p&gt;Erlang (staircasing):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight erlang"&gt;&lt;code&gt;&lt;span class="nv"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;process3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;process2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;process1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elixir (pipe operator):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;input&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process3&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In addition to the pipe operator, Elixir brings many other improvements that enhance the development experience as a whole. Features like built-in documentation, an interactive REPL, and complete development tools are available out of the box.&lt;/p&gt;

&lt;p&gt;For example, documentation can be written directly in the source code using &lt;code&gt;@moduledoc&lt;/code&gt; and &lt;code&gt;@doc&lt;/code&gt; annotations. This documentation is treated as a first-class part of the code. It can be accessed from IEx, converted into HTML or EPUB using &lt;code&gt;ExDoc&lt;/code&gt;, and even executed as part of tests using the &lt;em&gt;doctest&lt;/em&gt; feature.&lt;/p&gt;

&lt;p&gt;For daily development, Elixir provides &lt;em&gt;Mix&lt;/em&gt;, a unified tool for managing projects, dependencies, compilation, testing, and other common tasks. Mix integrates directly with &lt;em&gt;Hex&lt;/em&gt; (&lt;a href="https://hex.pm/" rel="noopener noreferrer"&gt;https://hex.pm&lt;/a&gt;), the official package manager in the BEAM ecosystem, making it easy to use and share libraries with the community.&lt;/p&gt;

&lt;p&gt;In short, Elixir brings the power and reliability of Erlang into a development experience that is more modern and enjoyable. With all these features, Elixir helps us write efficient, well-structured, and well-documented code from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Elixir’s Drawbacks
&lt;/h2&gt;

&lt;p&gt;No technology is perfect, and that includes Elixir and Erlang. It’s important to understand their weaknesses and limitations so we can decide whether Elixir fits the needs of the project we’re building.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance: Not for Raw Speed
&lt;/h3&gt;

&lt;p&gt;One of Elixir’s key limitations is execution speed. Since it runs on the BEAM virtual machine, Elixir cannot match the raw performance of languages like C, C++, or Rust that are compiled directly to machine code. If your application is CPU-bound, such as for image processing, machine learning, or video encoding, Elixir may not be the ideal choice.&lt;/p&gt;

&lt;p&gt;However, this is not a design flaw. It’s a deliberate architectural decision. BEAM is not built to be the fastest in terms of raw throughput or requests per second like Rust. Its focus is to stay stable under heavy load, provide fault tolerance, and handle massive concurrency efficiently.&lt;/p&gt;

&lt;p&gt;If part of your application needs high performance, you can write that part in another language like C or Rust, then integrate it using &lt;a href="https://www.erlang.org/doc/system/nif.html" rel="noopener noreferrer"&gt;NIF (Native Implemented Function)&lt;/a&gt;. This lets you get performance benefits without leaving the BEAM ecosystem entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ecosystem: Still Smaller Than Popular Languages
&lt;/h3&gt;

&lt;p&gt;The Elixir ecosystem is still relatively small compared to other popular languages. For comparison:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hex.pm/" rel="noopener noreferrer"&gt;Hex&lt;/a&gt;, the official package manager for Elixir and Erlang, offers around 20,000 libraries&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://packagist.org/" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt; for PHP has over 400,000 libraries&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;NPM&lt;/a&gt; for JavaScript and TypeScript has over 3 million packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means that during development, we may encounter situations where the library we need hasn’t been built yet. This can slow us down, especially if we’re used to working in ecosystems that provide packages for almost every use case.&lt;/p&gt;

&lt;p&gt;Aside from Elixir libraries, we can also use libraries from Erlang or other BEAM languages like &lt;a href="https://gleam.run/" rel="noopener noreferrer"&gt;Gleam&lt;/a&gt;. All of them are interoperable and complement each other well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Positive Trend: Community and Interest Keep Growing
&lt;/h4&gt;

&lt;p&gt;Even though Elixir’s ecosystem isn’t as large as JavaScript or Python, interest in Elixir is growing steadily. In the &lt;a href="https://survey.stackoverflow.co/2024/technology/#admired-and-desired" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey 2024&lt;/a&gt;, Elixir ranked second among the most desired languages after Rust. Phoenix, Elixir’s main web framework, even ranked first in the web frameworks and technologies category.&lt;/p&gt;

&lt;p&gt;This shows that more developers are exploring Elixir, and many are likely to contribute to the growth of its ecosystem. The Elixir community is also known for being friendly and welcoming to newcomers, which is a big help when learning or migrating from another language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning Resources for Elixir
&lt;/h2&gt;

&lt;p&gt;The main source for learning Elixir is its official documentation, especially the &lt;a href="https://hexdocs.pm/elixir/introduction.html" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt; section. There, we can learn the fundamentals of Elixir, from syntax and data structures to core concepts.&lt;/p&gt;

&lt;p&gt;In addition to the documentation, the book &lt;a href="https://www.manning.com/books/elixir-in-action-third-edition" rel="noopener noreferrer"&gt;&lt;em&gt;Elixir in Action&lt;/em&gt; (3rd edition)&lt;/a&gt; by Saša Jurić is also highly recommended. The book is divided into three main sections: the language fundamentals, concurrent programming on the BEAM, and real-world production use. This makes it a complete guide for anyone looking to understand Elixir deeply.&lt;/p&gt;

&lt;p&gt;For those who prefer learning visually, several video-based resources are available. The &lt;a href="https://elixircasts.io/series/learn-elixir" rel="noopener noreferrer"&gt;&lt;em&gt;ElixirCasts&lt;/em&gt;&lt;/a&gt; series and &lt;a href="https://www.youtube.com/playlist?list=PL2Rv8vpZJz4yFKklhZAAaKCcM1z6WQ_K-" rel="noopener noreferrer"&gt;&lt;em&gt;Elixir Mentor&lt;/em&gt;&lt;/a&gt; YouTube channel offer short and focused videos that explain Elixir topics clearly and directly. This format is great for quickly strengthening practical understanding.&lt;/p&gt;

&lt;p&gt;With all these learning paths, we can choose whichever suits us best, whether that’s documentation, books, or video tutorials.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Saša Jurić. (2024). &lt;em&gt;Elixir In Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;li&gt;Stack Overflow. (2024). &lt;em&gt;Stack Overflow Survey 2024: Admired and Desired Technologies&lt;/em&gt;. &lt;a href="https://survey.stackoverflow.co/2024/technology/#admired-and-desired" rel="noopener noreferrer"&gt;https://survey.stackoverflow.co/2024/technology/#admired-and-desired&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
    </item>
    <item>
      <title>Berkenalan Dengan Bahasa Pemrograman Elixir</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 04 Jun 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/berkenalan-dengan-bahasa-pemrograman-elixir-ne9</link>
      <guid>https://dev.to/muzhawir/berkenalan-dengan-bahasa-pemrograman-elixir-ne9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📜 You can read the English version &lt;a href="https://dev.to/muzhawir/getting-to-know-elixir-programming-language-5ek9"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Daftar Isi
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;Bahasa Modern untuk Menulis Kode di BEAM&lt;/li&gt;
&lt;li&gt;Peningkatan Fitur yang Dihadirkan oleh Elixir&lt;/li&gt;
&lt;li&gt;
Kekurangan Elixir

&lt;ul&gt;
&lt;li&gt;Performa Bukan untuk &lt;em&gt;Raw Performance&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Ekosistem Masih Lebih Kecil Dibanding Bahasa Populer&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Sumber Belajar Elixir&lt;/li&gt;

&lt;li&gt;Referensi&lt;/li&gt;

&lt;/ul&gt;






&lt;p&gt;Di pelajaran sebelumnya kita telah mengenal Erlang sebagai bahasa yang dijalankan di atas BEAM. Namun, BEAM tidak hanya menjalankan Erlang. Ada juga bahasa lain seperti Elixir dan Gleam yang memanfaatkan platform yang sama. Dalam pelajaran ini, kita akan berkenalan dengan Elixir, bahasa modern untuk menulis kode di BEAM, sekaligus melihat peningkatan fitur yang membuatnya menarik untuk dipelajari.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bahasa Modern untuk Menulis Kode di BEAM
&lt;/h2&gt;

&lt;p&gt;Elixir adalah bahasa pemrograman fungsional yang berjalan di atas mesin virtual &lt;strong&gt;BEAM&lt;/strong&gt;, mesin yang sama yang digunakan oleh Erlang. Elixir dirancang agar penulisan program lebih ringkas, mudah dibaca, dan mudah dirawat, sekaligus mewarisi keandalan serta kinerja tinggi dari platform Erlang.&lt;/p&gt;

&lt;p&gt;Kode Elixir dikompilasi menjadi &lt;em&gt;bytecode&lt;/em&gt; yang dijalankan oleh BEAM yang membuatnya sepenuhnya kompatibel dengan pustaka dan ekosistem Erlang. Kita bahkan bisa langsung menggunakan pustaka Erlang di proyek Elixir, dan sebaliknya.&lt;/p&gt;

&lt;p&gt;Elixir juga dirancang dengan fokus pada produktivitas. Bahasa ini memiliki sintaks yang sederhana serta dilengkapi alat bantu modern, dukungan pengujian otomatis, dan utilitas &lt;em&gt;debugging&lt;/em&gt; yang sesuai dengan kebutuhan pengembangan masa kini.&lt;/p&gt;

&lt;p&gt;Dengan dukungan tersebut, pengembang dapat membangun aplikasi dari kecil hingga besar dengan lebih mudah dipahami dan dikelola. Elixir menjembatani keandalan dan daya tahan Erlang dengan kenyamanan serta ekspresivitas bahasa modern.&lt;/p&gt;

&lt;p&gt;Elixir adalah proyek &lt;em&gt;open source&lt;/em&gt; yang dikembangkan secara aktif oleh komunitas. Bahasa ini diciptakan oleh &lt;a href="https://github.com/josevalim" rel="noopener noreferrer"&gt;José Valim&lt;/a&gt;, dan &lt;em&gt;source code&lt;/em&gt;-nya dapat diakses di repositori GitHub &lt;a href="https://github.com/elixir-lang/elixir" rel="noopener noreferrer"&gt;elixir-lang&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Peningkatan Fitur yang Dihadirkan oleh Elixir
&lt;/h2&gt;

&lt;p&gt;Salah satu keunggulan utama Elixir adalah kemampuannya mengurangi &lt;em&gt;boilerplate&lt;/em&gt; dan kebisingan sintaks (&lt;em&gt;syntactic noise&lt;/em&gt;) yang umum dijumpai di Erlang. Hasilnya, kode menjadi lebih sederhana, ekspresif, dan mudah dipelihara. Bagi &lt;em&gt;developer&lt;/em&gt; baru di ekosistem BEAM, sintaks Elixir terasa lebih ramah karena terinspirasi dari Ruby, bahasa yang dikenal bersih dan mudah dibaca. Hal ini menjadikan Elixir titik awal yang nyaman sebelum mempelajari kompleksitas Erlang secara mendalam.&lt;/p&gt;

&lt;p&gt;Perhatikan perbandingan sintaks antara Ruby dan Elixir berikut.&lt;/p&gt;

&lt;p&gt;Kode Ruby:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"Hello, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello Rubyst!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kode Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="s2"&gt;"Hello, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello Alchemist!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Struktur &lt;code&gt;def&lt;/code&gt;, penggunaan &lt;em&gt;string interpolation&lt;/em&gt; (&lt;code&gt;#{name}&lt;/code&gt;), dan alur logikanya hampir identik. Perbedaannya terletak pada penggunaan pasangan &lt;code&gt;do ... end&lt;/code&gt; di Elixir untuk mendefinisikan &lt;em&gt;function&lt;/em&gt;. Kemiripan ini membuat transisi dari Ruby ke Elixir terasa mulus, sementara bagi pemula seperti kita yang langsung belajar Elixir, sintaksnya tetap intuitif dan mudah diikuti.&lt;/p&gt;

&lt;p&gt;Setelah melihat kemiripan sintaks antara Ruby dan Elixir, kita bandingkan dua bahasa yang sama-sama berjalan di atas mesin BEAM: Erlang dan Elixir. Meskipun keduanya berorientasi pada paradigma pemrograman fungsional, alur program dalam Elixir terasa lebih alami dan mudah dibaca.&lt;/p&gt;

&lt;p&gt;Di Erlang, pemanggilan &lt;em&gt;function&lt;/em&gt; sering kali dilakukan secara bersarang (&lt;em&gt;staircasing&lt;/em&gt;), di mana setiap &lt;em&gt;function&lt;/em&gt; dijalankan dari dalam ke luar. Pola ini cepat menurunkan keterbacaan ketika jumlah &lt;em&gt;function&lt;/em&gt; bertambah.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight erlang"&gt;&lt;code&gt;&lt;span class="nv"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;process3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;process2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;process1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;))).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh di atas baru menggabungkan tiga &lt;em&gt;function&lt;/em&gt;; bayangkan tingkat kompleksitasnya jika ada sepuluh atau lebih.&lt;/p&gt;

&lt;p&gt;Elixir menyederhanakan pola tersebut dengan menghadirkan &lt;em&gt;pipe operator&lt;/em&gt; (&lt;code&gt;|&amp;gt;&lt;/code&gt;), yang menuliskan alur eksekusi dari kiri ke kanan atau atas ke bawah, sehingga logika program lebih mudah diikuti.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Satu baris&lt;/span&gt;
&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process3&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Multi baris&lt;/span&gt;
&lt;span class="n"&gt;input&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;process3&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Operator ini menjadi ciri khas gaya penulisan Elixir karena memudahkan pembacaan alur data dari awal hingga akhir.&lt;/p&gt;

&lt;p&gt;Selain &lt;em&gt;pipe operator&lt;/em&gt;, Elixir menambahkan berbagai fitur yang meningkatkan pengalaman pengembangan. Dokumentasi dapat ditulis langsung di dalam kode menggunakan atribut &lt;code&gt;@moduledoc&lt;/code&gt; dan &lt;code&gt;@doc&lt;/code&gt;, lalu diuji otomatis melalui &lt;em&gt;doctest&lt;/em&gt; seperti contoh berikut.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Provides simple mathematical operations.
  """&lt;/span&gt;

  &lt;span class="nv"&gt;@doc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Multiply number.

  ## Examples

      iex&amp;gt; Math.multiply(10)
      100
  """&lt;/span&gt;
  &lt;span class="nv"&gt;@spec&lt;/span&gt; &lt;span class="n"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dokumentasi ini dapat diubah menjadi HTML atau EPUB menggunakan &lt;strong&gt;ExDoc&lt;/strong&gt;. Kamu bisa melihat hasil nyatanya di &lt;a href="https://hexdocs.pm/elixir" rel="noopener noreferrer"&gt;dokumentasi resmi Elixir&lt;/a&gt;, karena dokumentasi yang kamu baca di sana juga dihasilkan langsung oleh &lt;em&gt;ExDoc&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dengan &lt;em&gt;ExDoc&lt;/em&gt;, &lt;em&gt;developer&lt;/em&gt; dapat menulis dokumentasi langsung di dalam &lt;em&gt;codebase&lt;/em&gt;, dan alat ini secara otomatis menghasilkan dokumentasi yang selalu selaras dengan perubahan kode. Pendekatan ini membantu menjaga keakuratan dan konsistensi antara kode dan penjelasannya.&lt;/p&gt;

&lt;p&gt;Untuk kebutuhan sehari-hari, Elixir menyediakan &lt;strong&gt;Mix&lt;/strong&gt;, alat terpadu untuk manajemen proyek, pengujian, kompilasi, serta pengelolaan dependensi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskib7dv7n0cdlmopme7u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fskib7dv7n0cdlmopme7u.png" alt="Mix Tool" width="745" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mix terhubung langsung dengan &lt;a href="https://hex.pm/" rel="noopener noreferrer"&gt;Hex&lt;/a&gt;, &lt;em&gt;package manager&lt;/em&gt; resmi ekosistem BEAM yang memudahkan distribusi dan instalasi pustaka. Keduanya terintegrasi erat, memungkinkan proses membangun, menguji, dan mendistribusikan aplikasi dilakukan sepenuhnya di dalam ekosistem Elixir.&lt;/p&gt;

&lt;p&gt;Singkatnya, Elixir menghadirkan kekuatan dan keandalan Erlang dalam pengalaman pengembangan yang lebih modern, efisien, dan menyenangkan. Dengan fitur-fitur tersebut, kita dapat menulis kode yang ringkas, terstruktur, dan terdokumentasi dengan baik sejak awal.&lt;/p&gt;

&lt;p&gt;Fitur-fitur yang dibahas di sini hanyalah sebagian kecil dari yang tersedia. Kamu dapat menjelajahi lebih banyak peningkatan dan kemampuan Elixir melalui &lt;a href="https://hexdocs.pm/elixir" rel="noopener noreferrer"&gt;dokumentasi resminya&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kekurangan Elixir
&lt;/h2&gt;

&lt;p&gt;Tidak ada teknologi yang sepenuhnya sempurna, termasuk Elixir dan platform yang berjalan di atas BEAM. Memahami kekurangan serta keterbatasannya penting agar kita dapat menilai apakah Elixir sesuai dengan kebutuhan proyek yang sedang dikembangkan. Pada akhirnya, keberhasilan sebuah proyek tidak ditentukan oleh seberapa populer teknologinya, melainkan oleh ketepatan memilih alat yang paling sesuai untuk menyelesaikan masalah yang dihadapi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performa Bukan untuk &lt;em&gt;Raw Performance&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Salah satu keterbatasan utama Elixir terletak pada performa eksekusinya. Karena berjalan di atas mesin virtual BEAM, Elixir tidak dapat menandingi kecepatan bahasa yang dikompilasi langsung ke kode mesin seperti C, C++, atau Rust. Untuk aplikasi yang sangat bergantung pada pemrosesan intensif CPU, seperti pengolahan gambar, &lt;em&gt;machine learning&lt;/em&gt;, atau &lt;em&gt;video encoding&lt;/em&gt;, Elixir bukanlah pilihan ideal.&lt;/p&gt;

&lt;p&gt;Namun, hal ini bukan merupakan kelemahan desain, melainkan konsekuensi dari keputusan arsitektur yang sengaja dibuat. BEAM memprioritaskan stabilitas di bawah beban tinggi, toleransi terhadap kegagalan, dan kemampuan menjalankan banyak proses (&lt;em&gt;concurrency&lt;/em&gt;) dalam skala besar, bukan mengejar &lt;em&gt;raw performance&lt;/em&gt; atau jumlah &lt;em&gt;requests per second&lt;/em&gt; semata.&lt;/p&gt;

&lt;p&gt;Jika sebagian kecil dari aplikasi membutuhkan performa tinggi, bagian tersebut dapat ditulis menggunakan bahasa lain seperti C, lalu diintegrasikan melalui &lt;a href="https://www.erlang.org/doc/system/nif.html" rel="noopener noreferrer"&gt;NIF (Native Implemented Function)&lt;/a&gt;. Pendekatan ini memungkinkan kita memanfaatkan keunggulan BEAM tanpa kehilangan efisiensi di bagian yang benar-benar kritis terhadap performa.&lt;/p&gt;

&lt;p&gt;Apabila aplikasi sepenuhnya bergantung pada komputasi intensif CPU, ada baiknya mempertimbangkan teknologi lain yang lebih sesuai dengan kebutuhan tersebut.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ekosistem Masih Lebih Kecil Dibanding Bahasa Populer
&lt;/h3&gt;

&lt;p&gt;Ekosistem Elixir saat ini masih lebih kecil dibanding bahasa pemrograman yang sudah lebih mapan. Sebagai perbandingan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hex.pm/" rel="noopener noreferrer"&gt;Hex&lt;/a&gt;, &lt;em&gt;package manager&lt;/em&gt; resmi ekosistem BEAM (Erlang, Elixir, Gleam), menyediakan sekitar &lt;strong&gt;20.000 pustaka&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://packagist.org/" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt; untuk PHP memiliki lebih dari &lt;strong&gt;400.000 pustaka&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;NPM&lt;/a&gt; untuk JavaScript dan TypeScript memiliki lebih dari &lt;strong&gt;3 juta pustaka&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keterbatasan ini berarti beberapa pustaka yang dibutuhkan mungkin belum tersedia. Meski demikian, Elixir memiliki keunggulan interoperabilitas dengan bahasa lain di ekosistem BEAM. Kita dapat menggunakan pustaka Erlang secara langsung, bahkan pustaka dari &lt;a href="https://gleam.run/" rel="noopener noreferrer"&gt;Gleam&lt;/a&gt;, karena seluruh bahasa di BEAM saling kompatibel. Dengan begitu, ruang eksplorasi dan solusi yang tersedia tetap luas.&lt;/p&gt;

&lt;p&gt;Meskipun ekosistem Elixir masih berkembang dan belum sebesar bahasa populer seperti JavaScript atau PHP, minat terhadapnya terus meningkat. Berdasarkan &lt;a href="https://survey.stackoverflow.co/2025/technology#admired-and-desired" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey 2025&lt;/a&gt;, Elixir menempati posisi &lt;strong&gt;ketiga&lt;/strong&gt; sebagai bahasa yang paling diinginkan, tepat di bawah Gleam di posisi kedua. Phoenix Framework, &lt;em&gt;web framework&lt;/em&gt; utama Elixir, bahkan menduduki &lt;strong&gt;peringkat pertama&lt;/strong&gt; dalam kategori &lt;em&gt;web frameworks and technologies&lt;/em&gt; yang paling diinginkan sejak 2023.&lt;/p&gt;

&lt;p&gt;Tren ini menunjukkan peningkatan minat yang konsisten dari komunitas pengembang. Pertumbuhan tersebut memperkuat ekosistem Elixir dari waktu ke waktu. Komunitasnya juga dikenal ramah dan suportif terhadap pendatang baru, menjadikannya lingkungan yang kondusif untuk belajar, berkontribusi, dan berkembang bersama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumber Belajar Elixir
&lt;/h2&gt;

&lt;p&gt;Jika kamu ingin mulai belajar Elixir, tempat terbaik untuk memulainya adalah dokumentasi resminya, terutama bagian &lt;a href="https://hexdocs.pm/elixir/introduction.html" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt;. Di sana kamu akan menemukan penjelasan dasar tentang sintaks, struktur data, dan konsep inti yang membentuk cara kerja Elixir.&lt;/p&gt;

&lt;p&gt;Selain dokumentasi, buku &lt;a href="https://www.manning.com/books/elixir-in-action-third-edition" rel="noopener noreferrer"&gt;&lt;em&gt;Elixir in Action&lt;/em&gt; edisi ketiga&lt;/a&gt; karya Saša Jurić juga sangat direkomendasikan. Buku ini dibagi menjadi tiga bagian besar: dasar bahasa, pemrograman &lt;em&gt;concurrent&lt;/em&gt; di BEAM, dan penerapan Elixir di sistem produksi. Penjelasannya runtut, praktis, dan cocok untuk siapa pun yang ingin memahami Elixir secara menyeluruh.&lt;/p&gt;

&lt;p&gt;Jika kamu lebih suka belajar lewat video, ada juga sumber visual seperti serial &lt;a href="https://elixircasts.io/series/learn-elixir" rel="noopener noreferrer"&gt;&lt;em&gt;ElixirCasts&lt;/em&gt;&lt;/a&gt; dan kanal YouTube &lt;a href="https://www.youtube.com/playlist?list=PL2Rv8vpZJz4yFKklhZAAaKCcM1z6WQ_K-" rel="noopener noreferrer"&gt;&lt;em&gt;Elixir Mentor&lt;/em&gt;&lt;/a&gt;. Keduanya menyajikan video pendek dan langsung ke intinya, jadi pas buat belajar konsep Elixir secara praktis tanpa bertele-tele.&lt;/p&gt;

&lt;p&gt;Dan tentu saja, kekuatan Elixir tidak hanya terletak pada teknologinya, tetapi juga pada komunitasnya. Forum &lt;a href="https://elixirforum.com" rel="noopener noreferrer"&gt;&lt;strong&gt;Elixir Forum&lt;/strong&gt;&lt;/a&gt;, kanal &lt;a href="https://discord.com/invite/elixir" rel="noopener noreferrer"&gt;&lt;strong&gt;Discord&lt;/strong&gt;&lt;/a&gt;, serta subreddit &lt;a href="https://www.reddit.com/r/elixir" rel="noopener noreferrer"&gt;&lt;strong&gt;r/elixir&lt;/strong&gt;&lt;/a&gt; menjadi tempat yang baik untuk berdiskusi, bertanya, dan berbagi proyek atau ide. Komunitasnya dikenal terbuka dan suportif; kamu dapat bertukar pengalaman dan belajar langsung dari para &lt;em&gt;alchemist&lt;/em&gt; 🧙‍♂️ yang lebih berpengalaman.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jurić, S. (2024). &lt;em&gt;Elixir in Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;li&gt;Stack Overflow. (2024). &lt;em&gt;Stack Overflow survey 2024: Admired and desired technologies.&lt;/em&gt; Retrieved from &lt;a href="https://survey.stackoverflow.co/2024/technology/#admired-and-desired" rel="noopener noreferrer"&gt;https://survey.stackoverflow.co/2024/technology/#admired-and-desired&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Functional Programming and Erlang Platform</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 28 May 2025 18:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/functional-programming-and-erlang-platform-3051</link>
      <guid>https://dev.to/muzhawir/functional-programming-and-erlang-platform-3051</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📜 You can read the Indonesian version &lt;a href="https://dev.to/muzhawir/pemrograman-fungsional-dan-platform-erlang-4mhe"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;
Functional Programming Paradigm

&lt;ul&gt;
&lt;li&gt;Imperative Programming&lt;/li&gt;
&lt;li&gt;Declarative Programming&lt;/li&gt;
&lt;li&gt;Object-Oriented Programming (OOP)&lt;/li&gt;
&lt;li&gt;Functional Programming (FP)&lt;/li&gt;
&lt;li&gt;Paradigms Used by Erlang and Elixir&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Basic Principles of Functional Programming

&lt;ul&gt;
&lt;li&gt;Immutability&lt;/li&gt;
&lt;li&gt;Pure Function&lt;/li&gt;
&lt;li&gt;First-Class Function&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Erlang Development Platform

&lt;ul&gt;
&lt;li&gt;Systems That Stay Available&lt;/li&gt;
&lt;li&gt;Concurrency in Erlang&lt;/li&gt;
&lt;li&gt;A Complete Development Platform&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;References&lt;/li&gt;

&lt;/ul&gt;



&lt;h2&gt;
  
  
  Functional Programming Paradigm
&lt;/h2&gt;

&lt;p&gt;Every programming language is built on top of one or more programming paradigms, which are ways of thinking that influence how we write code, manage data, and design solutions. Understanding these paradigms helps us choose the most effective approach to solving a problem.&lt;/p&gt;

&lt;p&gt;Let’s see a few commonly used paradigms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imperative Programming
&lt;/h3&gt;

&lt;p&gt;The imperative paradigm takes the approach of giving the computer &lt;strong&gt;step-by-step instructions&lt;/strong&gt; on how to accomplish a task. We explicitly and thoroughly control the sequence of actions, from initialization to final execution.&lt;/p&gt;

&lt;p&gt;Example in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code adds numbers from 1 to 5. Every process is explicit: we initialize a variable, run a loop, sum the values, and print the result. Languages like Python, C, and Java are strongly supportive of this paradigm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declarative Programming
&lt;/h3&gt;

&lt;p&gt;The declarative paradigm focuses on &lt;strong&gt;what&lt;/strong&gt; should be achieved, not &lt;strong&gt;how&lt;/strong&gt; to achieve it technically. We declare the desired outcome, and the compiler or runtime takes care of the execution details.&lt;/p&gt;

&lt;p&gt;Example in SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we don't write step-by-step data fetching logic. We simply state the goal: retrieving active users, and SQL handles the implementation details. This paradigm is also seen in HTML and regular expressions, where we describe the end result without dictating the process flow explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Object-Oriented Programming (OOP)
&lt;/h3&gt;

&lt;p&gt;The object-oriented paradigm structures applications as collections of objects. Each object stores data (state) and behavior (methods) to process that data. These objects interact with each other to form the application logic.&lt;/p&gt;

&lt;p&gt;Example in Java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;brand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Toyota"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;moveForward&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" is moving forward --&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="n"&gt;myCar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;myCar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;moveForward&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We define a &lt;code&gt;Car&lt;/code&gt; class with a &lt;code&gt;brand&lt;/code&gt; attribute and a &lt;code&gt;moveForward()&lt;/code&gt; method. Then we create a &lt;code&gt;myCar&lt;/code&gt; object and call its method. Languages like Java, Python, and JavaScript support this paradigm and encourage modularity and code reuse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Functional Programming (FP)
&lt;/h3&gt;

&lt;p&gt;The functional paradigm builds programs from many pure functions, which accept input, produce output, and do not cause side effects. This means a function’s result only depends on the input provided, without relying on or modifying external state. Data is processed through a series of functions that can be composed to form more complex logic.&lt;/p&gt;

&lt;p&gt;Example in Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We start with a list of numbers, then use the &lt;code&gt;filter&lt;/code&gt; function to select even numbers, and pass the result to the &lt;code&gt;map&lt;/code&gt; function to double them. No variables are modified, and all functions can be tested independently. Languages like Erlang and Elixir are designed to support this style.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paradigms Used by Erlang and Elixir
&lt;/h3&gt;

&lt;p&gt;Erlang and Elixir combine two main paradigms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Functional&lt;/strong&gt; - Programs are built from many pure functions that can be composed to create complex logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declarative&lt;/strong&gt; - We focus on the desired result, not the sequence of instructions. Execution details are handled by the runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This combination leads to code that is concise, modular, and easy to test. It is ideal for building large-scale systems that are fault-tolerant, can run in a distributed manner across multiple machines, and remain continuously available. For these reasons, the paradigm is widely used in telecommunications systems, real-time applications, and backend services that demand high reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Principles of Functional Programming
&lt;/h2&gt;

&lt;p&gt;Functional programming is an approach to writing code that differs from the imperative style. In the imperative approach, we write instructions step by step: do this, then that, change this value, and so on. In functional programming, we focus on how data flows and is transformed through a series of functions.&lt;/p&gt;

&lt;p&gt;We build programs by composing small functions. Data is passed into a function, which processes it and produces a new value, which can then be passed to the next function. This approach makes the program’s flow clearer and less surprising.&lt;/p&gt;

&lt;p&gt;To make this model work well, functional programming uses several key principles:&lt;/p&gt;

&lt;h3&gt;
  
  
  Immutability
&lt;/h3&gt;

&lt;p&gt;In functional programming, data is &lt;strong&gt;immutable&lt;/strong&gt;. This means once a value is created, it cannot be changed. If we want to “change” a value, the system actually creates a new modified copy, while the original data remains untouched.&lt;/p&gt;

&lt;p&gt;This approach is called &lt;strong&gt;data transformation&lt;/strong&gt;, not &lt;strong&gt;modification&lt;/strong&gt;, because we do not alter the old data but create a new version of it.&lt;/p&gt;

&lt;p&gt;Even though we haven’t fully covered Elixir yet, let’s look at a quick example. Each example below includes a brief explanation of what the code does.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;new_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Result: [0, 1, 2, 3]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;list&lt;/code&gt; variable still holds &lt;code&gt;[1, 2, 3]&lt;/code&gt; unchanged in memory. Meanwhile, &lt;code&gt;new_list&lt;/code&gt; is a new list created by prepending &lt;code&gt;0&lt;/code&gt; to it. This value is stored in a different memory location.&lt;/p&gt;

&lt;p&gt;Immutability offers several benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoids bugs caused by data being changed elsewhere.&lt;/li&gt;
&lt;li&gt;Makes data flow easier to track and understand.&lt;/li&gt;
&lt;li&gt;Prevents hidden or unpredictable state&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pure Function
&lt;/h3&gt;

&lt;p&gt;A pure function has two main characteristics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Its output is always the same for the same input. Whenever and wherever it is called, the result is consistent.&lt;/li&gt;
&lt;li&gt;It does not cause side effects. It does not print to the screen unexpectedly, write to files, modify external data, or secretly read values from outside.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example in Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an anonymous function stored in the &lt;code&gt;square&lt;/code&gt; variable. If we call &lt;code&gt;square.(4)&lt;/code&gt; multiple times, the result will always be &lt;code&gt;16&lt;/code&gt;. This function does not depend on any global state and does nothing beyond the &lt;code&gt;x * x&lt;/code&gt; calculation.&lt;/p&gt;

&lt;p&gt;Why are pure functions important?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to test: just provide input and check the result. There is no external influence, so results are consistent.&lt;/li&gt;
&lt;li&gt;Easy to compose: since they don’t have side effects, we can combine them without worrying about interference between functions.&lt;/li&gt;
&lt;li&gt;Easy to understand: we can read the function’s contents without needing to know the global application context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, not all functions can be pure. Writing to files, accessing databases, or sending HTTP requests all require side effects.&lt;/p&gt;

&lt;p&gt;In Elixir and many other modern functional languages, we can still write functions that perform side effects. However, the recommended approach is to separate side effects from the program’s core logic.&lt;/p&gt;

&lt;p&gt;This means we try to keep most functions pure, focusing solely on transforming data without relying on or changing the outside world. Meanwhile, functions that deal with side effects are placed in specific parts of the code that are responsible for external interactions, such as controllers in web applications that handle HTTP requests or perform file/database access.&lt;/p&gt;

&lt;p&gt;The goal is to keep most of the code clean, testable, and free of unexpected effects. We know exactly which parts of the code can be tested purely and which must be run in a real-world context like internet or file system interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  First-Class Function
&lt;/h3&gt;

&lt;p&gt;In the functional paradigm, functions are treated like regular values. This means functions can be stored in variables, passed as arguments to other functions, and returned as results from other functions.&lt;/p&gt;

&lt;p&gt;Quick example in Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;double&lt;/code&gt; is an &lt;em&gt;anonymous function&lt;/em&gt; stored in a variable. Then, in the &lt;code&gt;Enum.map&lt;/code&gt; &lt;em&gt;function&lt;/em&gt;, we pass &lt;code&gt;double&lt;/code&gt; as an argument that will be applied to each element of the list &lt;code&gt;[1, 2, 3]&lt;/code&gt; when &lt;code&gt;Enum.map&lt;/code&gt; is called.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erlang Development Platform
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/M7uo5jmFDUw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Before we learn Elixir, it's important to understand that it runs on top of Erlang. Without Erlang, Elixir wouldn’t run.&lt;/p&gt;

&lt;p&gt;Erlang is a development platform created by the Swedish telecommunications company Ericsson in the mid-1980s. Its original goal was to build telephone network systems that could run continuously, even under extreme conditions such as high call volume, software bugs, or hardware/software upgrades. In short, the system had to remain operational and available despite facing various disruptions.&lt;/p&gt;

&lt;p&gt;The name "Erlang" is short for &lt;em&gt;Ericsson Language&lt;/em&gt; and was developed by three main figures: Joe Armstrong, Robert Virding, and Mike Williams. Initially, it was used internally at Ericsson. But since its release as open-source software in 1998, Erlang has been widely adopted in industries such as telecommunications, banking, multiplayer gaming, and real-time systems.&lt;/p&gt;

&lt;p&gt;Over time, Erlang has proven effective in handling large-scale systems that require high availability and fault tolerance. This is why Elixir chose Erlang as its foundation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Systems That Stay Available
&lt;/h3&gt;

&lt;p&gt;Joe Armstrong once said in an interview with Rackspace in 2013:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If Java is write once, run anywhere. Erlang is write once, run forever.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This statement captures Erlang’s core philosophy: to create systems that keep running even when some components fail.&lt;/p&gt;

&lt;p&gt;To support this, Erlang was designed with the following principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fault Tolerance&lt;/strong&gt; - The system keeps running even if some processes crash. These processes can be replaced or recovered automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; - The system can handle more load without being shut down, whether by adding CPU, RAM, or running additional nodes on other machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed System&lt;/strong&gt; - Erlang allows multiple nodes to connect and work as a single unit. This facilitates data replication, load distribution, and protects against single points of failure that could take down the whole system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsiveness&lt;/strong&gt; - Erlang systems are designed to handle heavy loads and high demand quickly, even under sudden spikes like traffic surges or mass call events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hot Code Swapping&lt;/strong&gt; - Erlang allows live code updates without stopping the service. This is critical for systems that must remain continuously online.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Concurrency in Erlang
&lt;/h3&gt;

&lt;p&gt;From the beginning, Erlang was designed to handle large-scale concurrency. Systems like phone networks, banking services, and real-time communication platforms must be able to run many units of work simultaneously without interference.&lt;/p&gt;

&lt;p&gt;Unlike complex and heavyweight OS threads or processes, Erlang uses lightweight entities called &lt;strong&gt;Erlang processes&lt;/strong&gt;. These are not OS threads or processes, but lightweight units of work scheduled by the Erlang virtual machine called BEAM.&lt;/p&gt;

&lt;p&gt;They are extremely small and can be created in huge numbers, even millions, which makes them ideal for massive concurrency. We can run many processes efficiently, with low latency and strong isolation.&lt;/p&gt;

&lt;p&gt;Key advantages of Erlang processes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full process isolation&lt;/strong&gt; - Each process has its own memory and execution flow. If one process crashes, others continue unaffected. Because no memory is shared, there are no side effects or interference between processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous message passing&lt;/strong&gt; - All processes communicate by sending messages to one another. Since messages are passed by value (not by reference), each process works with its own copy of the data. This removes the need for locks or synchronization like in thread-based systems. There is no contention or waiting, so race conditions are avoided.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-process garbage collection&lt;/strong&gt; - Each process manages its own memory, including garbage collection. This means when one process is freeing unused memory, others continue running uninterrupted. There is no global pause.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight and efficient&lt;/strong&gt; - BEAM can run millions of processes efficiently. Erlang processes consume minimal memory and CPU. The BEAM scheduler fairly distributes execution time among all processes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A Complete Development Platform
&lt;/h3&gt;

&lt;p&gt;Erlang is not just a programming language. It is a full development platform that includes four key components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Erlang Language&lt;/strong&gt; - The functional programming language on this platform. Erlang code is compiled into bytecode that runs on the BEAM virtual machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEAM Virtual Machine&lt;/strong&gt; - The virtual machine that runs all Erlang (and Elixir) processes. BEAM handles process scheduling, memory management, message passing, and process isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OTP (Open Telecom Platform)&lt;/strong&gt; - A set of libraries and abstractions ready to use for building robust and structured systems. OTP is an inseparable part of Erlang, and together they are often called Erlang/OTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development tools&lt;/strong&gt; - Erlang provides tools like the interactive shell (&lt;code&gt;erl&lt;/code&gt;), debugger, profiler, and more. These tools help us develop, test, and deploy applications on the platform.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Erlang is an actively developed open-source project with regular releases. Its source code is available on &lt;a href="https://github.com/erlang/otp" rel="noopener noreferrer"&gt;GitHub Erlang/OTP&lt;/a&gt;, and Ericsson remains directly involved in its development.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Saša Jurić. (2024). &lt;em&gt;Elixir In Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;li&gt;IONOS Editorial Team. (2021, May 21). &lt;em&gt;Imperative Programming.&lt;/em&gt; &lt;a href="https://www.ionos.com/digitalguide/websites/web-development/imperative-programming" rel="noopener noreferrer"&gt;https://www.ionos.com/digitalguide/websites/web-development/imperative-programming&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Federico Pereiro. (n.d.). &lt;em&gt;Declarative Programming: Is It A Real Thing?&lt;/em&gt; Accessed May 23, 2024, from &lt;a href="https://www.toptal.com/software/declarative-programming" rel="noopener noreferrer"&gt;https://www.toptal.com/software/declarative-programming&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>erlang</category>
      <category>elixir</category>
    </item>
    <item>
      <title>Pemrograman Fungsional dan Platform Erlang</title>
      <dc:creator>Muzhawir Amri</dc:creator>
      <pubDate>Wed, 21 May 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/muzhawir/pemrograman-fungsional-dan-platform-erlang-4mhe</link>
      <guid>https://dev.to/muzhawir/pemrograman-fungsional-dan-platform-erlang-4mhe</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📜 You can read the English version &lt;a href="https://dev.to/muzhawir/functional-programming-and-erlang-platform-3051"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Daftar Isi
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;
Paradigma Pemrograman Fungsional

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Imperative Programming&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Declarative Programming&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Object-Oriented Programming&lt;/em&gt; (OOP)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Functional Programming&lt;/em&gt; (FP)&lt;/li&gt;
&lt;li&gt;Paradigma di Erlang dan Elixir&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Prinsip Dasar Pemrograman Fungsional

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Immutability&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pure Function&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;First-Class Function&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Recursion&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Lazy Evaluation&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Platform Pengembangan Erlang

&lt;ul&gt;
&lt;li&gt;Apa Itu Erlang&lt;/li&gt;
&lt;li&gt;Sejarah Singkat Erlang&lt;/li&gt;
&lt;li&gt;Sistem dengan Ketersediaan Tinggi (&lt;em&gt;High Availability System&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Erlang Process&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Penerapan Nyata dalam Sistem &lt;em&gt;Server-side&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Erlang sebagai Platform Pengembangan&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Referensi&lt;/li&gt;

&lt;/ul&gt;






&lt;p&gt;Selamat datang di pembelajaran Elixir! Sebelum kita menulis &lt;code&gt;"Hello World!"&lt;/code&gt; pertama, ada baiknya kita berkenalan dulu dengan paradigma pemrograman fungsional, cara berpikir yang menjadi dasar dalam bahasa ini. Saya yakin kamu yang membaca ini mungkin berasal dari latar belakang seperti JavaScript, TypeScript, atau Ruby, dan sudah terbiasa dengan gaya pemrograman imperatif serta berorientasi objek. Di Elixir, kita akan melihat pemrograman dari sudut yang sedikit berbeda, di mana kita tidak menggunakan &lt;em&gt;class&lt;/em&gt; atau &lt;em&gt;object&lt;/em&gt;, melainkan membangun program melalui kumpulan &lt;em&gt;function&lt;/em&gt; yang saling bekerja sama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paradigma Pemrograman Fungsional
&lt;/h2&gt;

&lt;p&gt;Paradigma pemrograman adalah cara berpikir dalam menulis kode. Paradigma menentukan bagaimana kita memberi instruksi kepada komputer, mengolah data, dan menyelesaikan masalah.&lt;/p&gt;

&lt;p&gt;Setiap bahasa pemrograman umumnya mendukung satu atau lebih paradigma. Pemilihan paradigma yang tepat membantu kita menulis kode yang lebih mudah dibuat, dibaca, dan dipelihara.&lt;/p&gt;

&lt;p&gt;Dalam praktiknya, terdapat beberapa paradigma yang umum digunakan, seperti &lt;em&gt;imperative&lt;/em&gt;, &lt;em&gt;declarative&lt;/em&gt;, &lt;em&gt;object-oriented&lt;/em&gt;, dan &lt;em&gt;functional&lt;/em&gt;. Berikut penjelasannya.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Imperative Programming&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Paradigma imperatif merupakan pendekatan tradisional dalam menulis program. Di sini kita menjelaskan secara terperinci &lt;strong&gt;bagaimana&lt;/strong&gt; komputer harus menyelesaikan suatu tugas, langkah demi langkah. Analogi sederhananya seperti mengikuti resep masakan yang dijalankan secara berurutan.&lt;/p&gt;

&lt;p&gt;Contoh dalam Ruby:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Total: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kode ini menghitung jumlah angka dari 1 hingga 5 dengan menambahkan nilainya ke variabel &lt;code&gt;total&lt;/code&gt; secara bertahap. Paradigma ini banyak digunakan di bahasa populer seperti Ruby, JavaScript, Python, dan PHP.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Declarative Programming&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Paradigma deklaratif menekankan pada &lt;strong&gt;apa&lt;/strong&gt; yang ingin dicapai, bukan bagaimana cara mencapainya. Kita cukup menyatakan hasil yang diinginkan, sementara komputer atau &lt;em&gt;runtime&lt;/em&gt; menentukan langkah-langkah pelaksanaannya.&lt;/p&gt;

&lt;p&gt;Contoh dalam SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita hanya menyebutkan tujuannya, mengambil semua pengguna aktif tanpa perlu menjelaskan proses pencariannya.&lt;/p&gt;

&lt;p&gt;Contoh serupa dalam Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita hanya menyatakan bahwa ingin menjumlahkan seluruh elemen &lt;code&gt;numbers&lt;/code&gt;, dan &lt;em&gt;function&lt;/em&gt; &lt;code&gt;Enum.sum&lt;/code&gt; menangani detail prosesnya. Pendekatan deklaratif juga banyak ditemukan di HTML, CSS, dan &lt;em&gt;regular expressions&lt;/em&gt;. Dalam Elixir, gaya ini berpadu dengan paradigma fungsional untuk menghasilkan kode yang ringkas dan ekspresif.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Object-Oriented Programming&lt;/em&gt; (OOP)
&lt;/h3&gt;

&lt;p&gt;Paradigma berorientasi objek menyusun program dalam bentuk &lt;em&gt;object&lt;/em&gt;, yaitu representasi dari entitas nyata atau konsep abstrak. Setiap &lt;em&gt;object&lt;/em&gt; memiliki data (&lt;em&gt;state&lt;/em&gt;) dan perilaku (&lt;em&gt;method&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Bayangkan robot mainan: setiap robot memiliki status internal seperti energi baterai (&lt;em&gt;state&lt;/em&gt;) dan aksi yang bisa dilakukan (&lt;em&gt;behavior&lt;/em&gt;). Ketika kita memberi perintah, robot merespons sesuai kondisinya.&lt;/p&gt;

&lt;p&gt;Konsep utama dalam OOP meliputi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Encapsulation&lt;/em&gt;: menggabungkan data dan perilaku dalam satu kesatuan.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Inheritance&lt;/em&gt;: memungkinkan &lt;em&gt;object&lt;/em&gt; mewarisi sifat dan perilaku dari &lt;em&gt;object&lt;/em&gt; lain.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Polymorphism&lt;/em&gt;: instruksi yang sama dapat dijalankan dengan cara berbeda oleh &lt;em&gt;object&lt;/em&gt; yang berbeda.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh dalam Ruby:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Robot&lt;/span&gt;
  &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:battery&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;battery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
    &lt;span class="vi"&gt;@battery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;battery&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;move_forward&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@battery&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is moving forward"&lt;/span&gt;
      &lt;span class="vi"&gt;@battery&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; has no energy left!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Alpha"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;r1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;move_forward&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita membuat &lt;em&gt;class&lt;/em&gt; &lt;code&gt;Robot&lt;/code&gt; dengan atribut &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;battery&lt;/code&gt;, lalu menambahkan perilaku &lt;code&gt;move_forward&lt;/code&gt;. Saat objek &lt;code&gt;r1&lt;/code&gt; dipanggil untuk bergerak, ia menyesuaikan perilaku berdasarkan status baterainya.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Functional Programming&lt;/em&gt; (FP)
&lt;/h3&gt;

&lt;p&gt;Pemrograman fungsional berfokus pada penyusunan program dari banyak &lt;em&gt;function&lt;/em&gt; kecil yang masing-masing menjalankan satu tugas spesifik. &lt;em&gt;Function&lt;/em&gt; tersebut kemudian dikombinasikan untuk membentuk alur kerja yang lebih kompleks.&lt;/p&gt;

&lt;p&gt;Karakteristik utama FP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pure function&lt;/strong&gt;: selalu menghasilkan keluaran yang sama untuk input yang sama tanpa efek samping (&lt;em&gt;side effect&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immutability&lt;/strong&gt;: data bersifat tetap dan tidak diubah setelah dibuat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alih-alih memodifikasi data, FP biasanya membuat data baru menggunakan &lt;em&gt;function&lt;/em&gt; seperti &lt;code&gt;map&lt;/code&gt; atau &lt;code&gt;filter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Contoh dalam Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kode ini mengambil angka genap dari &lt;code&gt;numbers&lt;/code&gt;, lalu menggandakan nilainya. Variabel &lt;code&gt;numbers&lt;/code&gt; tetap tidak berubah karena setiap operasi menghasilkan daftar baru.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paradigma di Erlang dan Elixir
&lt;/h3&gt;

&lt;p&gt;Erlang dan Elixir menggabungkan paradigma deklaratif dan fungsional. Alih-alih menulis instruksi langkah demi langkah, kita cukup mendeskripsikan tujuan program, sedangkan detail eksekusinya ditangani oleh &lt;em&gt;runtime&lt;/em&gt;. Semua data bersifat &lt;em&gt;immutable&lt;/em&gt;, dan logika program dibangun dari kumpulan &lt;em&gt;pure functions&lt;/em&gt; yang saling berinteraksi.&lt;/p&gt;

&lt;p&gt;Pendekatan ini membuat program lebih mudah diuji, lebih aman dari efek samping, dan secara alami mendukung &lt;em&gt;concurrency&lt;/em&gt; (menjalankan banyak proses secara paralel). Inilah alasan mengapa Elixir dan Erlang sangat efektif untuk sistem berskala besar dan berdaya tahan tinggi (&lt;em&gt;fault-tolerant systems&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Prinsip Dasar Pemrograman Fungsional
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Functional programming&lt;/em&gt; adalah paradigma yang berfokus pada penyusunan program dari banyak &lt;em&gt;function&lt;/em&gt; kecil, di mana masing-masing &lt;em&gt;function&lt;/em&gt; menangani satu tugas spesifik. &lt;em&gt;Function&lt;/em&gt; tersebut kemudian digabungkan untuk membentuk alur kerja yang lebih kompleks.&lt;/p&gt;

&lt;p&gt;Dalam paradigma ini, program dipandang sebagai rangkaian &lt;strong&gt;transformasi data&lt;/strong&gt;, sebuah &lt;em&gt;function&lt;/em&gt; menerima input, mengolahnya, lalu menghasilkan output baru tanpa mengubah data asli.&lt;/p&gt;

&lt;p&gt;Pendekatan ini berbeda dengan gaya &lt;em&gt;imperative&lt;/em&gt;, di mana program ditulis sebagai urutan instruksi yang mengubah &lt;em&gt;state&lt;/em&gt; (keadaan) dari waktu ke waktu. Dalam &lt;em&gt;imperative programming&lt;/em&gt;, fokusnya adalah &lt;strong&gt;bagaimana&lt;/strong&gt; langkah-langkah dijalankan, sedangkan dalam &lt;em&gt;functional programming&lt;/em&gt; fokusnya ada pada &lt;strong&gt;hasil dari transformasi data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dengan merangkai &lt;em&gt;function&lt;/em&gt; dan mengalirkan hasilnya ke &lt;em&gt;function&lt;/em&gt; berikutnya, alur pemrosesan data menjadi lebih jelas, mudah dibaca, serta aman dari efek samping. Pendekatan ini juga mempermudah pemeliharaan dan pengujian kode.&lt;/p&gt;

&lt;p&gt;Paradigma ini dibangun di atas beberapa prinsip utama berikut.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Immutability&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Dalam pemrograman fungsional, data bersifat &lt;em&gt;immutable&lt;/em&gt;, artinya setelah dibuat nilainya tidak dapat diubah. Jika kita ingin "mengubah" data, yang sebenarnya terjadi adalah pembuatan salinan baru dengan nilai berbeda, sementara data asli tetap utuh. Proses ini disebut &lt;strong&gt;transformasi data&lt;/strong&gt;, bukan &lt;strong&gt;modifikasi&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Contoh dalam Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;new_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Hasil: [0, 1, 2, 3]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variabel &lt;code&gt;list&lt;/code&gt; tetap berisi &lt;code&gt;[1, 2, 3]&lt;/code&gt;. Saat kita menambahkan &lt;code&gt;0&lt;/code&gt; di depan, Elixir membuat &lt;em&gt;list&lt;/em&gt; baru bernama &lt;code&gt;new_list&lt;/code&gt; tanpa mengubah data lama.&lt;/p&gt;

&lt;p&gt;Sekilas, &lt;em&gt;immutability&lt;/em&gt; tampak kurang efisien karena membuat data baru alih-alih mengubah yang sudah ada. Namun, bahasa fungsional modern seperti Elixir menggunakan berbagai optimisasi di balik layar, sehingga hanya bagian data yang benar-benar berubah yang disalin.&lt;/p&gt;

&lt;p&gt;Keunggulan &lt;em&gt;immutability&lt;/em&gt; antara lain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data lebih aman&lt;/strong&gt;, karena tidak bisa diubah secara tidak sengaja.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alur program lebih mudah dipahami&lt;/strong&gt;, sebab nilai tidak berubah di tengah proses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risiko &lt;em&gt;bug&lt;/em&gt; berkurang&lt;/strong&gt;, terutama akibat perubahan tak terduga.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mendukung eksekusi paralel&lt;/strong&gt;, karena setiap proses bekerja pada salinannya sendiri.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Pure Function&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Pure function&lt;/em&gt; adalah &lt;em&gt;function&lt;/em&gt; yang selalu menghasilkan output yang sama untuk input yang sama dan tidak menimbulkan efek samping. Dua ciri utamanya adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deterministik&lt;/strong&gt;: hasilnya selalu sama untuk input yang sama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bebas efek samping&lt;/strong&gt;: tidak mengubah &lt;em&gt;state&lt;/em&gt; di luar dirinya dan tidak berinteraksi langsung dengan lingkungan eksternal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh dalam Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kode di atas mendefinisikan &lt;em&gt;anonymous function&lt;/em&gt; bernama &lt;code&gt;square&lt;/code&gt; yang selalu mengembalikan kuadrat dari inputnya. Jika kita memanggil &lt;code&gt;square.(2)&lt;/code&gt;, hasilnya pasti &lt;code&gt;4&lt;/code&gt; tanpa variasi atau pengaruh dari luar.&lt;/p&gt;

&lt;p&gt;Keuntungan &lt;em&gt;pure function&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mudah diuji&lt;/strong&gt;, cukup beri input dan periksa output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mudah dirangkai&lt;/strong&gt; (&lt;em&gt;function composition&lt;/em&gt;), dapat digabung untuk membentuk alur transformasi data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mudah dipahami&lt;/strong&gt;, karena perilakunya dapat diprediksi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tentu, tidak semua bagian program bisa sepenuhnya &lt;em&gt;pure&lt;/em&gt;. Interaksi dengan file, basis data, atau jaringan pasti menimbulkan efek samping. Prinsip utamanya adalah memisahkan logika &lt;em&gt;pure&lt;/em&gt; dari bagian yang berinteraksi dengan dunia luar. Dalam Elixir, efek samping biasanya ditangani di lapisan seperti &lt;em&gt;controller&lt;/em&gt;, sedangkan logika inti dijaga tetap murni.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;First-Class Function&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Dalam paradigma fungsional, &lt;em&gt;function&lt;/em&gt; diperlakukan sebagai warga kelas satu (&lt;em&gt;first-class citizen&lt;/em&gt;). Artinya, &lt;em&gt;function&lt;/em&gt; memiliki kedudukan yang sama dengan data biasa sehingga dapat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disimpan dalam variabel.&lt;/li&gt;
&lt;li&gt;Diteruskan sebagai argumen ke &lt;em&gt;function&lt;/em&gt; lain.&lt;/li&gt;
&lt;li&gt;Dikembalikan sebagai hasil dari &lt;em&gt;function&lt;/em&gt; lain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh dalam Elixir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# result: [2, 4, 6]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;double&lt;/code&gt; adalah &lt;em&gt;anonymous function&lt;/em&gt; yang menggandakan nilai input.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Function&lt;/em&gt; &lt;code&gt;double&lt;/code&gt; diteruskan sebagai argumen ke &lt;code&gt;Enum.map&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Enum.map&lt;/code&gt; memanggil &lt;code&gt;double&lt;/code&gt; untuk setiap elemen dalam &lt;code&gt;[1, 2, 3]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Hasilnya adalah &lt;em&gt;list&lt;/em&gt; baru &lt;code&gt;[2, 4, 6]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hal ini menjadi dasar bagi tiga konsep penting dalam pemrograman fungsional yang akan kita pelajari nanti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lambda (&lt;em&gt;anonymous function&lt;/em&gt;)&lt;/strong&gt;: &lt;em&gt;function&lt;/em&gt; tanpa nama yang biasanya singkat dan dipakai langsung.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closure&lt;/strong&gt;: &lt;em&gt;function&lt;/em&gt; yang membawa konteks lingkungannya sehingga tetap dapat mengakses variabel luar meskipun dijalankan di tempat lain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Higher-Order Function (HOF)&lt;/strong&gt;: &lt;em&gt;function&lt;/em&gt; yang menerima &lt;em&gt;function&lt;/em&gt; lain sebagai argumen atau mengembalikannya sebagai hasil.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Recursion&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Rekursi adalah teknik di mana sebuah &lt;em&gt;function&lt;/em&gt; memanggil dirinya sendiri dengan versi masalah yang lebih kecil hingga mencapai kondisi berhenti.&lt;/p&gt;

&lt;p&gt;Dalam pemrograman fungsional, rekursi menggantikan &lt;em&gt;looping&lt;/em&gt;. Bahasa seperti Elixir tidak menyediakan &lt;code&gt;for&lt;/code&gt; atau &lt;code&gt;while&lt;/code&gt; tradisional karena data bersifat &lt;em&gt;immutable&lt;/em&gt;, sehingga variabel penghitung tidak bisa diubah di setiap iterasi. Solusinya adalah memanggil kembali &lt;em&gt;function&lt;/em&gt; yang sama hingga kondisi berhenti tercapai.&lt;/p&gt;

&lt;p&gt;Contoh sederhana mencetak $n$ bilangan asli pertama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="err"&gt;❶&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;when&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;  &lt;span class="err"&gt;❷&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ Kasus dasar &lt;code&gt;n = 1&lt;/code&gt; menjadi titik berhenti rekursi.&lt;/li&gt;
&lt;li&gt;❷ Kondisi kedua memanggil &lt;code&gt;print&lt;/code&gt; dengan &lt;code&gt;n - 1&lt;/code&gt;, lalu mencetak nilai &lt;code&gt;n&lt;/code&gt; setelah rekursi selesai.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika kita memanggil &lt;code&gt;print(3)&lt;/code&gt;, hasilnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
2
3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;em&gt;Lazy Evaluation&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Lazy evaluation&lt;/em&gt; adalah teknik menunda eksekusi perhitungan hingga hasilnya benar-benar dibutuhkan. Program tidak langsung menghitung semua nilai, melainkan menyiapkan "rencana" perhitungan. Nilai baru dihitung hanya saat diperlukan.&lt;/p&gt;

&lt;p&gt;Keunggulan &lt;em&gt;lazy evaluation&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lebih efisien&lt;/strong&gt;, karena hanya menghitung nilai yang dibutuhkan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dapat menangani data besar atau tak terbatas&lt;/strong&gt;, karena tidak harus membuat seluruh struktur data sekaligus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh dalam Elixir menggunakan &lt;code&gt;Stream&lt;/code&gt;, yang bekerja secara &lt;em&gt;lazy&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="err"&gt;❶&lt;/span&gt;

&lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="err"&gt;❷&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❶ &lt;code&gt;Stream.map&lt;/code&gt; tidak langsung menggandakan elemen &lt;code&gt;[1, 2, 3]&lt;/code&gt;, tetapi menyiapkan rencana perhitungan.&lt;/li&gt;
&lt;li&gt;❷ Saat &lt;code&gt;Enum.sum&lt;/code&gt; dipanggil, barulah perhitungan dijalankan. Elemen digandakan menjadi &lt;code&gt;[2, 4, 6]&lt;/code&gt;, lalu dijumlahkan menghasilkan &lt;code&gt;12&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Platform Pengembangan Erlang
&lt;/h2&gt;

&lt;p&gt;Sebelum mempelajari Elixir, penting untuk memahami platform tempat Elixir berjalan, yaitu Erlang. Elixir dibangun di atas ekosistem Erlang. Memahami lapisan dasarnya membantu kita melihat mengapa Elixir sangat kuat untuk membangun sistem dengan ketersediaan tinggi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apa Itu Erlang
&lt;/h3&gt;

&lt;p&gt;Erlang adalah bahasa pemrograman sekaligus platform pengembangan yang dirancang untuk membuat sistem dengan ketersediaan tinggi (&lt;em&gt;high availability&lt;/em&gt;). Nama "Erlang" diambil dari Agner Krarup Erlang, matematikawan Denmark yang mengembangkan teori antrian (&lt;em&gt;queueing theory&lt;/em&gt;) dalam telekomunikasi. Nama ini juga sering dianggap sebagai singkatan dari Ericsson Language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sejarah Singkat Erlang
&lt;/h3&gt;

&lt;p&gt;Erlang dikembangkan pada pertengahan 1980-an oleh Ericsson Computer Science Laboratory di Swedia. Tiga tokoh utamanya adalah Joe Armstrong, Robert Virding, dan Mike Williams. Tujuan mereka sederhana tetapi ambisius, yaitu membangun sistem telekomunikasi yang tidak pernah berhenti berjalan, bahkan saat terjadi lonjakan panggilan, kesalahan perangkat lunak, atau kegagalan perangkat keras.&lt;/p&gt;

&lt;p&gt;Sistem jaringan telepon Ericsson harus beroperasi tanpa henti selama 24 jam. Satu kegagalan kecil dapat memutus layanan bagi ribuan pengguna.&lt;/p&gt;

&lt;p&gt;Pada tahun 1998, Erlang dirilis sebagai perangkat lunak &lt;em&gt;open source&lt;/em&gt;. Sejak itu, Erlang digunakan dalam berbagai sistem besar seperti WhatsApp, Discord, RabbitMQ, sistem finansial, hingga &lt;em&gt;backend&lt;/em&gt; gim &lt;em&gt;multiplayer&lt;/em&gt;. Selama lebih dari tiga dekade, Erlang terbukti stabil, andal, dan mampu menangani skala besar. Inilah kekuatannya, membangun sistem yang terus hidup (&lt;em&gt;high availability systems&lt;/em&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Sistem dengan Ketersediaan Tinggi (&lt;em&gt;High Availability System&lt;/em&gt;)
&lt;/h3&gt;

&lt;p&gt;Joe Armstrong pernah berkata dalam sebuah wawancara pada tahun 2013:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Kalau Java itu tulis sekali, jalankan di mana saja. Erlang itu tulis sekali, jalankan selamanya."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ungkapan ini merangkum filosofi Erlang, membangun sistem yang tetap berjalan meskipun terjadi kegagalan. Untuk mencapainya, Erlang memiliki beberapa kemampuan penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fault Tolerance&lt;/strong&gt;: proses yang gagal tidak menjatuhkan seluruh sistem. Proses rusak dapat dibuat ulang secara otomatis, dan efek kegagalannya dibatasi secara lokal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: sistem dapat diperluas tanpa menghentikan layanan, baik dengan menambah sumber daya (&lt;em&gt;vertical scaling&lt;/em&gt;) maupun menambah &lt;em&gt;node&lt;/em&gt; baru (&lt;em&gt;horizontal scaling&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed System&lt;/strong&gt;: sistem dapat dijalankan di banyak mesin. Jika satu mesin gagal, mesin lain mengambil alih tanpa menghentikan layanan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsiveness&lt;/strong&gt;: sistem tetap responsif meskipun beban meningkat. Proses berat tidak memblokir proses lain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hot Code Swapping&lt;/strong&gt;: aplikasi dapat diperbarui tanpa waktu henti, misalnya memperbarui perangkat lunak telepon tanpa memutus panggilan aktif.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semua kemampuan ini dimungkinkan oleh mesin virtual Erlang dan model konkurensi yang digunakannya.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Erlang Process&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Untuk mencapai ketersediaan tinggi, Erlang menggunakan mesin virtual BEAM (Bogdan/Björn’s Erlang Abstract Machine) serta model konkurensi berbasis proses. &lt;em&gt;Erlang process&lt;/em&gt; adalah unit eksekusi terkecil di Erlang. Ia berbeda dari &lt;em&gt;thread&lt;/em&gt; sistem operasi karena setiap proses sepenuhnya terisolasi, tidak berbagi memori, dan berkomunikasi melalui pengiriman pesan (&lt;em&gt;message passing&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Model ini memungkinkan satu sistem Erlang menjalankan ribuan bahkan jutaan proses secara bersamaan.&lt;/p&gt;

&lt;p&gt;Keunggulan model proses Erlang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fault Tolerance&lt;/strong&gt;: kegagalan satu proses tidak memengaruhi proses lain. &lt;em&gt;Supervisor process&lt;/em&gt; mengawasi proses lain dan dapat membuat ulang proses yang gagal secara otomatis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: komunikasi berbasis pesan menghindari kerumitan sinkronisasi. BEAM menjadwalkan proses ke seluruh inti CPU secara otomatis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distribution&lt;/strong&gt;: proses dapat berkomunikasi dengan proses lain di mesin mana pun dengan cara yang sama tanpa memedulikan lokasi fisiknya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsiveness&lt;/strong&gt;: BEAM menggunakan &lt;em&gt;preemptive scheduler&lt;/em&gt; yang memastikan tidak ada proses yang mendominasi CPU. Pengumpulan sampah (&lt;em&gt;garbage collection&lt;/em&gt;) dilakukan per proses sehingga cepat dan tidak mengganggu keseluruhan sistem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Model inilah yang membuat sistem Erlang tetap hidup meskipun terjadi kegagalan parsial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Penerapan Nyata dalam Sistem &lt;em&gt;Server-side&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Kekuatan Erlang paling terasa pada sistem &lt;em&gt;server-side&lt;/em&gt;, yaitu sistem yang berjalan di &lt;em&gt;server&lt;/em&gt; untuk melayani banyak pengguna secara terus-menerus. Contoh utamanya adalah aplikasi &lt;em&gt;chat&lt;/em&gt;, sistem telekomunikasi, dan &lt;em&gt;backend&lt;/em&gt; layanan waktu nyata (&lt;em&gt;real-time backend&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Sistem &lt;em&gt;server-side&lt;/em&gt; biasanya terdiri atas beberapa komponen yang tersebar di banyak mesin (&lt;em&gt;node&lt;/em&gt;). Erlang memudahkan pembangunan sistem seperti ini dengan menyediakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Konkurensi bawaan untuk menangani ribuan hingga jutaan koneksi.&lt;/li&gt;
&lt;li&gt;Distribusi lintas mesin dengan komunikasi pesan yang seragam.&lt;/li&gt;
&lt;li&gt;Mekanisme &lt;em&gt;failover&lt;/em&gt; yang menjaga layanan tetap berjalan ketika sebagian &lt;em&gt;node&lt;/em&gt; gagal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Contoh Kasus Perbandingan Dua Web Server
&lt;/h4&gt;

&lt;p&gt;Dalam salah satu proyeknya, &lt;a href="https://linkedin.com/in/sasajuric" rel="noopener noreferrer"&gt;Saša Jurić&lt;/a&gt;, penulis buku &lt;em&gt;Elixir in Action&lt;/em&gt; yang menjadi rujukan utama seri ini, membandingkan dua pendekatan dalam membangun web server dengan kebutuhan teknis berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Melayani banyak klien.&lt;/li&gt;
&lt;li&gt;Menangani permintaan dengan waktu proses panjang (&lt;em&gt;long-running requests&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Mengelola &lt;em&gt;server-wide state&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Menyimpan data persisten.&lt;/li&gt;
&lt;li&gt;Menjalankan &lt;em&gt;background jobs&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hasil perbandingan menunjukkan perbedaan yang mencolok:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server A&lt;/strong&gt; membutuhkan tumpukan teknologi beragam seperti NGINX, Ruby on Rails, Redis, MongoDB, cron, dan Bash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server B&lt;/strong&gt; mampu menangani seluruh kebutuhan tersebut langsung di dalam platform Erlang.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kebutuhan Teknis&lt;/th&gt;
&lt;th&gt;Server A&lt;/th&gt;
&lt;th&gt;Server B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;HTTP Server&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;NGINX, Phusion Passenger&lt;/td&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Request Processing&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Ruby on Rails&lt;/td&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Long-running Requests&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Server-wide State&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Persistable Data&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Redis, MongoDB&lt;/td&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Background Jobs&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;cron, Bash, Ruby&lt;/td&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Service Crash Recovery&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Upstart&lt;/td&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Perbandingan ini menunjukkan bahwa Erlang menghadirkan solusi yang lebih ringkas. Sebagian besar kebutuhan sistem, mulai dari pengelolaan koneksi, &lt;em&gt;state&lt;/em&gt;, hingga pemulihan kegagalan, dapat ditangani langsung oleh platform tanpa integrasi kompleks antar teknologi.&lt;/p&gt;

&lt;p&gt;Namun, Erlang tidak dimaksudkan untuk menggantikan seluruh teknologi populer yang sudah ada. Ia lebih tepat dipandang sebagai platform kuat untuk membangun sistem lengkap dengan kompleksitas awal yang rendah, namun tetap memungkinkan integrasi dengan bahasa atau layanan lain bila diperlukan.&lt;/p&gt;

&lt;p&gt;Singkatnya, Erlang memberikan fleksibilitas tinggi bagi &lt;em&gt;developer&lt;/em&gt;. Ia dapat digunakan sebagai platform mandiri atau diintegrasikan dengan teknologi lain sesuai kebutuhan sistem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Erlang sebagai Platform Pengembangan
&lt;/h3&gt;

&lt;p&gt;Erlang bukan hanya bahasa pemrograman, tetapi platform lengkap yang terdiri atas beberapa komponen utama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bahasa Erlang&lt;/strong&gt;: bahasa fungsional untuk menulis program yang dijalankan di mesin BEAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mesin Virtual BEAM&lt;/strong&gt;: mengeksekusi &lt;em&gt;bytecode&lt;/em&gt;, mengatur proses, komunikasi antarproses, serta menjaga sistem tetap berjalan meskipun terjadi kesalahan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OTP (Open Telecom Platform)&lt;/strong&gt;: kumpulan pustaka dan pola desain siap pakai untuk membangun sistem Erlang. OTP mencakup manajemen proses, pengawasan, pembaruan kode tanpa henti, dan pemantauan sistem. OTP sering disebut bersama Erlang sebagai Erlang/OTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling&lt;/strong&gt;: berbagai alat bantu untuk menjalankan, mengelola, dan berinteraksi dengan program Erlang beserta dependensinya.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Erlang/OTP bersifat &lt;em&gt;open source&lt;/em&gt;, tersedia di berbagai sistem operasi utama, dan masih aktif dikembangkan oleh Ericsson serta komunitas melalui repositori resmi &lt;a href="https://github.com/erlang/otp" rel="noopener noreferrer"&gt;Erlang/OTP di GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Saša Jurić. (2024). &lt;em&gt;Elixir In Action&lt;/em&gt; (3rd ed.). Manning Publications.&lt;/li&gt;
&lt;li&gt;IONOS Editorial Team. (2021, May 21). &lt;em&gt;Imperative Programming.&lt;/em&gt; &lt;a href="https://www.ionos.com/digitalguide/websites/web-development/imperative-programming" rel="noopener noreferrer"&gt;https://www.ionos.com/digitalguide/websites/web-development/imperative-programming&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Federico Pereiro. (n.d.). &lt;em&gt;Declarative Programming: Is It A Real Thing?&lt;/em&gt; Diakses Mei 23, 2024, dari &lt;a href="https://www.toptal.com/software/declarative-programming" rel="noopener noreferrer"&gt;https://www.toptal.com/software/declarative-programming&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>erlang</category>
      <category>elixir</category>
      <category>indonesia</category>
    </item>
  </channel>
</rss>
