หัด Erlang and Elixir v0.1.0

wingyplus

Thanabodee Charoenpiriyakij

Posted on January 6, 2020

หัด Erlang and Elixir v0.1.0

หลังจากไปงาน Elixir meetup ครั้งที่ผ่านมา สารภาพว่าไปไม่ทัน แถมไม่รู้เรื่องอะไรกับเค้าเลย T_T) เลยอยากลองสรุปเรื่อง Erlang กับ Elixir นิดหน่อย

NOTE: ผมใช้ macOS นะ

การติดตั้ง

ทั้งสองภาษาติดตั้งได้ผ่าน brew

# Erlang
$ brew install erlang

# Elixir
$ brew install elixir

REPL

ทั้งสองภาษามี repl bundle มาให้ในตัว โดย Erlang นั้นจะใช้ชื่อว่า erl พอเราสั่งคำสั่งนี้ก็จะเปิด repl มาให้เลย

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

Eshell V10.6.1  (abort with ^G)
1>

ส่วนของ Elixir นั้นใช้ชื่อว่า iex ก็จะหน้าตาคล้ายกันหน่อย

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

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

หากถ้าอยากออกทั้งสอง shell ทำได้เหมือนกันเลยคือกด Ctrl-C จากนั้นกด a แล้ว Enter :)

Hello, World

เริ่มที่ Erlang ก่อนเลย

% hello_module.erl
-module(hello_module).
-export([hello/0]).

hello() ->
    io:format("~s~n", ["Hello, World"]).

Erlang มีกฎอยู่ว่าไฟล์ 1 ไฟล์จะประกอบไปด้วย 1 module และชื่อไฟล์ต้องตรงกับชื่อ module นั้นๆ ซึ่ง module จะต้องประกาศโดยใช้ -module(<module_name>). เสมอ จากนั้นเราต้องบอกด้วยว่า module นี้จะ export function อะไรบ้าง สังเกตว่าจะมี /0 ต่อหลัง hello นั้นหมายความว่าให้ export function hello ที่มีจำนวน arguments 0 ตัว เดี๋ยวไว้อธิบายทีหลังจากว่ามีทำไม

ตัว function นั้นจะใช้ -> เพื่อเปิด function body และใช้ . เพื่อบอกว่าจบ function แล้ว

ต่อมาคือการ compile เราสามารถ compile ได้ผ่าน erl โดยใช้ function ชื่อ c():

1> c(hello_module).
{ok,hello_module}

หาก compile ผ่าน c จะตอบกลับมาว่า ok กับชื่อ module ที่มัน compile ผ่านแล้ว

ทีนี้มา Elixir บ้าง

กฎการตั้งชื่อไฟล์จะคล้ายๆ กัน แต่นามสกุลไฟล์เป็น .ex

# hello_module.ex

defmodule HelloModule do
  def hello() do
    IO.puts "Hello, World"
  end
end

การประกาศ module ของ Elixir นั้นใช้ keyword defmodule ตามด้วยชื่อ module ซึ่งจะใช้ pascal case กัน

การประกาศ function ใช้ keyword def ตามด้วยชื่อ function และใช้ do และ end เพื่อเปิดและปิด function body

การ compile นั้นใช้ c() เหมือนกันแต่ต่างกันตรง Elixir จะใส่ชื่อไฟล์แทนชื่อ module:

iex(1)> c("hello_module.ex")
[HelloModule]

เรียก function

ทั้งสองภาษาจะคล้ายกันโดยใช้ชื่อ module ตามด้วย function และ arguments แต่ต่างกันนิดหน่อยตรง syntax โดย Erlang ใช้ <module>:<function>(<args...>).

2> hello_module:hello().
Hello, World
ok

ส่วน Elixir ใช้

iex(2)> HelloModule.hello()
Hello, World
:ok

อีกหนึ่งความแตกต่างคือ Elixir ยอมให้เรียก function โดยไม่ใส่ () ได้ เช่น

iex(2)> HelloModule.hello
Hello, World
:ok

พอล่ะ ง่วง zZZ

💖 💪 🙅 🚩
wingyplus
Thanabodee Charoenpiriyakij

Posted on January 6, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related