มาเริ่มเขียนโปรแกรมแบบ Functional ด้วย Elixir กันดีกว่า | muitsfriday.dev

web-logo-doge muitsfriday.dev

มาเริ่มเขียนโปรแกรมแบบ Functional ด้วย Elixir กันดีกว่า

มาเริ่มเขียนโปรแกรมแบบ Functional ด้วย Elixir กันดีกว่า | Functional Programming with Elixir Part 1

Fri Apr 01 2022

ช่วงนี้เริ่มศึกษาการเขียนโปรแกรมแบบ functional มาได้สักพักเกิดอาการคันยิบๆ ที่มือ ถือโอกาสอันดีก็เริ่มศึกษาซะเลย

ซึ่งผมเองก็มองๆ อยู่ว่าเราอยากทำอะไรแล้วจะใช้ภาษาอะไรในการทำ โดยตัวผมเองเป็นคนที่ทำด้านเว็บมาตั้งแต่แบเบาะ เลยพยายามหาภาษาที่เข้าใจง่ายๆ เพื่อมาลองไอเดียซึ่งอยู่ๆ ช่วงนั้นพอดีก็มีพี่ที่รู้จักแนะนำเจ้านี่มา Elixir

หลังจากที่เข้าไปเผือกใน document มาได้สักพักก็รู้สึกว่าไอ้เจ้าภาษานี้มีกลิ่นไอแห่งความเป็น ruby เยอะมาก ตัวมันเป็นเป็นภาษาที่รันบน erlang อีกทีนึงซึ่ง erlang ก็เป็นภาษา functional ที่มีมานานแล้ว (เข้าๆ ไปดูแล้ว syntax จะเก่าๆ หน่อย) ตัว elixir เป็น ontop ที่ปรับปรุงให้เขียนง่ายขึ้น(หวังว่านะ) งั้นก็เริ่มจากอันนี้เลยน่าจะดี

ทำไมต้อง functional

ก็เพราะว่าอยากลองไงล่ะ(โดนเตะ) นั่นก็ส่วนนึงแต่จริงๆ เขาว่ากันว่าภาษาที่เป็น functional เนี่ยโดย nature ของมันแล้วโปรแกรมจะ break ยากมากๆ และสามารถเขียนเทสได้ง่ายด้วยความที่มันมี concept ของ pure function ล้วนๆ

ส่วนความยากก็คือเราจะไม่ค่อยชินกับ paradiam นี้กันเท่าไหร่ เพราะเราเขียนโปรแกรมแบบ imperative กันมาตั้งแต่แบเบาะ พอมาเจอการเขียนแบบ declarative ก็จะเกิดอาการ culture shock นิดๆ แต่ไม่มีอะไรที่เราทำไม่ได้ถูกไหมล่ะ?

เริ่มติดตั้ง

การติดตั้งจริงๆ ไม่ว่าจะอะไรก็ตามควรไปอ่านที่ website หลักของมันเพราะโดยปกติของพวกนี้จะมีการเปลี่ยนแปลงตลอดเวลา จิ้มลิงก์ไปอ่านได้ https://elixir-lang.org/install.htmlhttps://elixir-lang.org/install.html

ถ้าใช้ mac ก็ติดตั้งผ่าน brew ได้ง่ายๆ

ถ้าใช้วินโดว์ยิ่งง่าย มี installer ให้ click nextๆๆๆ จบเลยล่ะ

Hello World

ถ้าไม่ได้ Hello World ก็เหมือนมาไม่ถึงภาษานั้นๆ part นี้จะชิวๆ แค่เริ่ม hello world ให้ได้พอก่อน งั้นมาเริ่มกันเลย

สร้าง file module แรกของเราขึ้นมา

concept ของ module จะคล้ายๆ ในภาษาอื่นๆ คือเราสามารถ group code ของเราเป็น module เล็กๆ เพื่อจัดหมวดหมู่ได้

เริ่มต้นด้วยการที่เราจะสร้าง module ที่ว่า HelloWorld ขึ้นมาก่อนด้วยการใช้คำสั่ง defmodule ตั้งชื่อไฟล์ว่า HelloWorld.exs

defmodule HelloWorld do
  # code ใน module อยู่ตรงนี้
end

จากนั้นให้เราจะประกาศ function ขึ้นมา ด้วย def เพื่อใช้เป็น function ที่ print ค่าออกทาง standard IO เป็นคำว่า Hello World

ใน Elixir มันก็จะมี module ที่ใช้สำหรับการติดต่อ IO ให้อยู่แล้ว เราเรียกมาใช้ได้เลย ด้วย IO.puts(a, b)

IO.puts รับ argument อยู่สองตัว ตัวแรกคือช่องทางที่ข้อความจะแสดงออกไป ในที่นี้เราส่งออกไปเป็น atom ที่ชื่อว่า :stdio เพื่อบอกว่าเราจะให้ข้อความออกไปทาง console ของเรานะ ส่วนargument ที่ 2 คือตัวข้อความเอง เราใส่เป็น string ลงไป

สุดท้ายหน้าตาจะได้แบบด้านล่าง

(atom คือค่าคงตัว เรากำหนดอะตอมได้ด้วยการใช้เครื่องหมาย : นำหน้าค่าที่เราจะสร้างเป็น atom)

defmodule HelloWorld do
  def print do
    IO.puts(:stdio, "Hello World")
  end
end

รันโปรแกรมยังไงดี

เบื้องต้นเราสามารถรัน code module ที่เราสร้างขึ้นมาได้ผ่าน iex (interactive elixir) ให้เราเรียก iex ขึ้นมาใน terminal (ใน windows เป็น iex.bat) ตัว terminal ของเราจะเข้าสู่ interactive shell ของ elixir เราสามารถพิมพ์โค้ด elixir ในนี้เพื่อลองรันคำสั่งต่างๆได้

PS D:\freetime-2020\elixir-content> iex.bat
Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 

ให้เราทำการเรียกใช้ module HelloWorld ที่เพิ่งสร้างขึ้นมาด้วยคำสั่ง c(“ชื่อไฟล์”)

PS ~> iex.bat
Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("01-HelloWorld.exs") 
[HelloWorld]

สุดท้ายคือการเรียกใช้ function ใน module นั้นด้วยการพิมพ์คำสั่ง HelloWorld.print()

HelloWorld คือชื่อ module และ print คือชื่อ function ที่เรา def เอาไว้ใน module นั้นๆ

PS ~> iex.bat
Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("01-HelloWorld.exs") 
[HelloWorld]
iex(2)> HelloWorld.print()
Hello World
:ok         

เย้! ได้ Hello World แล้ว

Wrap up

นี่คือการเตรียมตัวเบื้องต้นเท่านั้นเพื่อให้ได้ลองสัมผัสบรรยากาศของการเขียนโปรแกรมด้วย elixir ว่ามันจะเป็นแนวๆ ไหน จะเห็นว่า elixir เป็นภาษาที่ค่อนข้างเข้าใจง่ายยิ่งถ้าเคยเขียนภาษาอื่นมาก่อน elixir นี่จะเป็นอะไรที่หวานมากๆ ครั้งหน้าเราจะมาต่อเรื่อง idea พื้นฐานของการเขียนโปรแกรม elixir กันนะ