หลังจากไปงาน 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
Top comments (0)