ลองติดตั้งและใช้ Elixir เบื้องต้น (just print "Hello, World")
Tags: elixir, functional
Published: 2020-01-05 10:38:35

[Elixir](https://elixir-lang.org) เป็นภาษาแบบ Dynamic Type และเป็น Functional Programming ซึ่งอาศัยข้อดีของระบบของ [Erlang VM](http://erlang.org) มาเป็นพื้นฐาน (คือ compile Elixir แล้วได้ Erlang beam ซึ่งเป็น bytecode ของ Erlang ที่เอาไปรันผ่าน Erlang VM อีกที) และทำให้ Syntax นั้นเป็นมิตรกับคนเขียนมากกว่า Erlang (แต่จริงๆบางคนก็ชอบ Syntax ของ Erlang และมองว่าอ่านง่ายกว่า Elixir ก็มีนะ)

วันนี้จะลองติดตั้งแล้วลองใช้คำสั่ง iex, elixir และ elixirc เพื่อรันโค้ด Elixir เบื้องต้นกันดู

## Install
ผมใช้ macOS ดังนั้นวิธีติดตั้งของผมเลยเลือกติดตั้งผ่าน [`brew`](https://brew.sh) ได้เลยแค่สั่ง 

```shell
brew install elixir
```

หลังจากลงแล้วเรียบร้อยแล้วลองสั่ง `elixir -v` ดูถ้าลงเรียบร้อยก็จะแสดง version ของ elixir และ erlang ให้แบบนี้

```
> elixir -v
Erlang/OTP 22 [erts-10.6.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Elixir 1.9.4 (compiled with Erlang/OTP 22)
```

หลังติดตั้งเสร็จเราจะได้ command มาใหม่ 4 อันได้แก่

- elixir ใช้รัน Elixir script (ไฟล์นามสกุล .exs)
- elixirc ใช้ compile Elixir module (ไฟล์นามสกุล .ex)
- iex เป็น interactive Elixir เพื่อให้เราเรียกใช้ฟังก์ชันต่างๆได้เลยไม่ต้องเขียนลงไฟล์ก่อน
- mix เป็น build tool ลอง Elixir ใช้ build project เตรียม build task ได้

แต่วันนี้เราจะลองแค่ iex, elixir, elixirc

## iex
ลองสั่ง iex แล้วจะขึ้นเป็น interactive shell ให้เราแบบนี้

```
Erlang/OTP 22 [erts-10.6.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```

เพื่อให้เราลองเรียกคำสั่งหรือฟังก์ชันของ Elixir ได้เลย ตัวอย่างเช่น เรียกใช้ `IO.puts "Hello, World"` ก็จะได้ผลลัพธ์แบบนี้

```
iex(1)> IO.puts "Hello, World"
Hello, World
:ok
iex(2)>
```

สำหรับ Elixir โค้ดจะถูกแบบออกเป็น Module และภายใน Module เราจะประกาศและกำหนดฟังก์ชันกันภายใน Module นั่นเอง เสร็จแล้วในฝั่งคนใช้งาน การจะเรียกใช้ฟังก์ชัน ก็แค่ใช้ชื่อ Module ตามด้วย dot และชื่อฟังก์ชันที่เราต้องการเรียก พร้อมกับส่งค่าให้ฟังก์ชันถ้าฟังก์ชันนั้นต้องรับค่า เช่นที่เราเรียกด้านบน IO คือชื่อ module IO ที่รวบรวมฟังก์ชันเกี่ยวกับ Input/Output เอาไว้ และเราเรียกฟังก์ชัน puts โดยส่ง argument เป็นค่า string `"Hello, World"` ไปให้ 

IO.puts ก็แค่เอาค่าที่เราส่งไปแสดงผลที่คอนโซลแล้วส่งค่า :ok กลับออกมา (:ok เป็นค่าประเภท Atom ใน Elixir)

## elixir
คำสั่ง elixir เป็นการสั่งให้รัน Elixir script ซึ่งเป็นไฟล์ที่เราเขียนโค้ดในลักษณะสคริปต์คือเรียกใช้ Elixir function เป็นลำดับๆไปนั่นเอง ซึ่งไฟล์สำหรับ Elixir script จะให้มีนามสกุลเป็น `.exs` เช่น `hello.exs` มีโค้ดอยู่แบบนี้

```elixir
# hello.exs
IO.puts "Hello, World"
```

เวลาเราอยากรันสคริปต์นี้ก็แค่สั่ง

```shell
elixir hello.exs
Hello World
```
เราก็จะเห็นผลลัพธ์ที่แสดงออกคอนโซลเป็น Hello World

## elixirc
elixirc เป็นคำสั่งเพื่อ compile โค้ด Elixir Module ให้กลายเป็น Erlang bytecode ได้นามสกุล .beam ซึ่งเราสามารถโหลด Module ที่เรา compile แล้วมาเรียกใช้ได้

สำหรับนามสกุลไฟล์ของ Elixir Module นั้นจะเป็น `.ex` ตัวอย่างเช่นผมเขียน module ใหม่ในไฟล์ hello.ex แบบนี้

```elixir
defmodule Hello do
  def say do
    IO.puts "Hello, World"
  end
end
```

จากโค้ดเราประกาศ module ใหม่โดยใช้คำสั่ง defmodule ตามด้วยชื่อ module ซึ่งต้องขึ้นต้นด้วยอักษรตัวใหญ่ แล้วตามด้วย block do end ภายใน block do end เราจะเขียนฟังก์ชันสำหรับ module นี้โดยใช้คำสั่ง def ตามด้วยชื่อฟังก์ชันเช่น say แล้วตามด้วย block do end ซึ่งภายในนี้จะเป็น body ของ function ว่าเราจะให้ฟังก์ชันทำอะไรบ้าง เช่น say เราแค่เรียกใช้ IO.puts เพื่อแสดง Hello, World

เรา compile module นี้โดยสั่ง

```shell
elixirc hello.ex
```

แล้วเราจะได้ไฟล์ `Elixir.Hello.beam` ขึ้นมา

เราสามารถลองเรียกใช้ module Hello ได้โดยเปิด iex ขึ้นมาแล้วสั่งแบบนี้

```
iex(1)> Hello.say
Hello, World
:ok
```

วันนี้เราได้ลองใช้ 3 คำสั่ง iex, elixir, elixirc เบื้องต้นกันไปแล้ว เราสามารถเข้าไปเริ่มหัดภาษา Elixir ต่อได้แล้วครับโดยที่เว็บไซต์หลักของภาษานั้นมี [Getting Started](https://elixir-lang.org/getting-started/introduction.html) เป็น tutorial ให้เราหัดต่อได้เลย