Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

สวัสดี Clojure มาเริ่มต้นเรียนรู้กัน ?

$
0
0

จากหนังสือ Getting Clojure ออก beta version มา (Build your functional skills one idea at a time) ซึ่งแบ่งเนื้อหาเป็น 3 ระดับคือ Basic, Intermediate และ Advance พบว่ามีให้อ่านฟรี ๆ 3 บทคือ เนื่องจากไม่เคยเขียนภาษานี้เลย ดังนั้นก็ต้องเริ่มด้วย Hello Clojure สิ เริ่มกันเลย ในบทแรกนี้เป็นพื้นฐานสุด ๆ ของภาษา Clojure ซึ่งในหนังสือใช้คำว่า Very Basic !! ประกอบไปด้วย syntax, data type และ function ไม่ต้องเรียนรู้เยอะ รู้เท่าที่จะเริ่มต้นได้ก่อนก็พอ

ก่อนจะเริ่มต้นอ่าน ผู้เขียนได้บอกไว้ 2 ข้อซึ่งน่าสนใจคือ

ข้อที่ 1 เนื้อหาในหนังสือไม่ได้สอนเขียน Clojure โดยตรง แต่จะเป็นการแนะนำ ลงรายละเอียด พร้อมจุดที่น่าสนใจ และคำเตือนต่าง ๆ ซึ่งถ้าต้องการพัฒนาระบบงานด้วยภาษา Clojure จริง ๆ มันก็ขึ้นอยู่กับตัวคุณเองเท่านั้น ข้อที่ 2 การเรียนรู้ภาษา Clojure นั้นต้องใช้ความพยายามสูง แต่สิ่งที่ได้รับกลับมาก็น่าจะคุ้มค่านะ เพราะว่า Clojure จะช่วยทำให้ code มัน clean ไม่เยิ้นเย้อ

ดังนั้นมาเริ่มเขียนดีกว่าจาก Very Basic

ก่อนอื่นต้องเตรียมเครื่องมือในการพัฒนาให้เรียบร้อย (Development tool) แต่ว่ามีทางเลือกเยอะเลยนะ แต่ในหนังสือจะใช้เครื่องมือชื่อว่า Leiningen อ่านว่า "LINE-ing-en"

ดังนั้นขั้นตอนแรกก็ติดตั้ง Leiningen ก่อนเลย

ใช้เวลานิดนึงนะครับ ผลที่ได้ก็ตามนี้ [gist id="ae5a6338a28c7c619f6dbb279efaf94e" file="1.txt"] เมื่อเครื่องมือพร้อมก็ต้อง Hello World สิ ใช้งานผ่าน REPL ของ Leiningen นั่นเองดังนี้ [gist id="ae5a6338a28c7c619f6dbb279efaf94e" file="2.txt"] คำอธิบาย
  • ข้อมูล string จะอยู่ภายในเครื่องหมาย double quote
  • comment ใช้เครื่องหมาย semicolon (;)
  • println คือชื่อ function ที่ถูกสร้างไว้ให้ใช้งานจาก Clojure
  • จะเห็นว่า การเรียกใช้งาน function จะอยู่ใน ( ... ) เสมอ นี่คือรูปแบบการเรียกใช้ function นะ
โดยปกติการเรียกใช้งาน function จะเป็น println(“Hello World”) นี่คืออีกเรื่องที่ นักพัฒนาต้องปรับเปลี่ยนและใช้เวลาในการฝึกพอควร !! มาดูการเรียกใช้งาน function อื่น ๆ บ้าง [gist id="ae5a6338a28c7c619f6dbb279efaf94e" file="3.txt"]
มาถึงตรงนี้ทำให้เราน่าจะพอคุ้นเคยกับตัวภาษามันบ้าง บางคนบอกว่า เลิกดีกว่า แต่ทนหน่อยนะ ไปต่อกัน

เรื่องต่อไปก็พวก บวก ลบ คูณ หาร

แน่นอนว่าจะขัดแย้งกับรูปแบบการเขียนแบบทั่วไป ที่มักจะมีรูปแบบเป็น infix นั่นคือ 1 + 2 = 3 แต่ใน Clojure มันคือ (+ 1 2) นี่มัน prefix ชัด ๆๆ !! มาลองฝึกกัน [gist id="ae5a6338a28c7c619f6dbb279efaf94e" file="4.txt"] ซึ่งมักจะมีคำถามเกี่ยวกับรูปแบบของภาษา ว่าทำไมต้องเป็น prefix ด้วย ? เหตุผลคือ ลำดับการทำงานต้องเหมือนการพูด ว่าคุณจะทำอะไร ไม่ใช่ 1 บวก 2 แต่ต้องพูดว่า เราจะบวก (+) เลข 1 เลข 2 นี่คือสิ่งที่ Clojure บอกว่ามันคือ Simplicity นั่นเอง

การประกาศตัวแปรต่าง ๆ และกำหนดค่า

ในภาษา Clojure นั้นมีแนวทางที่ต่างออกไป แต่มันดูตรงไปตรงมา มีรูปแบบดังนี้ [code] (def symbol value) [/code] คำอธิบาย
  • symbol เทียบง่าย ๆ คือ ชื่อตัวแปรนั่นเอง
  • value คือ ค่าที่ต้องการจัดเก็บ หรือเป็น expression ก็ได้ ซึ่งจะถูก evaluate หรือประมวลผล
  • def คือการเชื่อมโยงหรือ binding ระหว่าง symbol และ value เข้าด้วยกัน
มาดูตัวอย่างการใช้งาน [gist id="ae5a6338a28c7c619f6dbb279efaf94e" file="5.txt"] สิ่งที่น่าสนใจคือ symbol นั่นเอง ปกติชื่อตัวแปรจะมีข้อจำกัดมากมาย แต่ใน symbol นั้นสามารถตั้งชื่อแบบนี้ได้ this&that|other*hellM*re การตั้งชื่อ symbol มีกฏนิดหน่อย ยกตัวอย่างเช่น ไม่สามารถใช้ (, ), [, ], @ และ ^ เนื่องจากถูกใช้ในตัวภาษาไปแล้ว รวมทั้งไม่สามารถนำหน้าด้วยตัวเลขและ colon (:) ได้เนื่องจากคือ keyword [gist id="ae5a6338a28c7c619f6dbb279efaf94e" file="6.txt"]
ใน community ของ Clojure นิยมใช้ convention เรียกว่า kebab case ยกตัวอย่างเช่น all-lowwer-case-with-words-separated-by-dashes

การสร้าง function

มาถึงอีกเรื่องที่น่าสนใจคือ การสร้าง function สามารถเขียนได้ดังนี้ โดยกลับมาที่ hello world กัน [gist id="ae5a6338a28c7c619f6dbb279efaf94e" file="7.txt"] คำอธิบาย
  • ในการประกาศ function จะใช้ defn
  • parameter ของ function จะอยู่ใน [ parameter1 parameter2 ]
  • แต่ละ parameter ไม่จำเป็นต้องมีเครื่องหมาย comma คั่น เพียงใช้ spacebar ก็ได้
  • แต่สามารถใส่ comma ไปได้นะ ซึ่ง Clojure จะมองว่า comma คือ whitespace แต่เขาไม่ใส่กันนะ
  • จากนั้นในส่วนต่อมาคือ body ของการทำงาน ซึ่งจะเรียกว่า expression อยู่ในเครื่องหมาย ( expression )
  • จากตัวอย่างสามารถเขียนอยู่ในบรรทัดเดียวกันหรือแยกบรรทัดได้ ซึ่งขึ้นบรรทัดใหม่นั้น จะถูกมองเป็น whitespace
  • ถ้า function มีการทำงานยาว ๆ มักจะเว้นบรรทัด
  • ในแต่ละชั้นของการทำงานจะขึ้นด้วย 2 spacebar (ไม่เป็น tab นะ)
  • อีกอย่าง การ return ค่าออกจาก function จะไม่มี keyword return เหมือนที่เคยเขียนกันมา
  • โดยที่ expression สุดท้ายจะถูก return ออกจาก function นั้น ๆ เอง
ที่สำคัญคือ ไม่มีการประกาศชนิดของตัวแปรใด ๆ เลย นั่นหมายความว่า ชนิดของตัวแปรจะถูกกำหนดเมื่อทำการกำหนดค่าให้ครั้งแรก ซึ่งไม่สามารถเปลี่ยนชนิดได้อีกเลย นี่คือสิ่งที่ Clojure เลือก เพื่อให้มีความยืดหยุ่นและกระชับ

มาถึงตรงนี้ก็จบในเรื่องแรก

สำหรับเริ่มต้นศึกษาภาษา Clojure ในช่วงวันหยุดสุดสัปดาห์ อย่างน้อยก็ Hello World ได้นะ
ชอบประโยคแรกของหนังสือ เลยเอามาใส่ตอนท้ายของการสรุปคือ This is where the FUN starts …
ขอให้สนุกกับการ coding ครับ

Viewing all articles
Browse latest Browse all 1997

Trending Articles