Sunday, April 20, 2014

Review Corona SDK part.2 Language from the moon.


มาพูดถึงตัวภาษาที่ใช้ใน Corona SDK กันบ้าง ก็คือภาษา Lua (ใน Official ให้อ่านออกเสียงว่า ลู-อะ แต่ไม่มีใครอ่านแบบนั้นสักคน จะฝรั่งหรือไทยก็อ่าน "ลัว" กันหมด)

ประวัติของมันก็ไปอ่านกันได้ที่ http://www.lua.org/

ตัวภาษามันก็เป็นภาษา script อารมณ์เดียวกับ Javascript, python, ruby, php ฯลฯ เทือกๆนี้แหละครับ ส่วนตัวแล้วผมว่ามันคล้ายๆ Javascript แต่มันก็มีอะไรที่เป้นของมันเองเยอะเหมือนกันนะ

วิธีการเขียนก็ง่ายๆสไตล์ภาษาScript อย่างเช่นอยากจะ Hello world ก็แค่

 print("Hello world")  

แล้ว save เป็นไฟล์ สมมติว่าชื่อ hello.lua แล้วรันด้วย command (ต้องติดตั้ง lua เองต่างหากนะครับ Corona SDK ไม่มีมาให้ เด๊่ยวจะมาแนะนำวันหลัง)

>lua hello.lua

แค่นี้ก็ทำงานได้แล้วครับ

แต่ว่าแค่นี้มันจะไปพิเศษยังไงกันล่ะ มีภาษาอื่นๆทำได้ตั้งเยอะแยะ เดี๋ยวลองดูไปเรื่อยๆละกันครับ

ไม่ต้องประกาศ Type 
เป็นมาตรฐานของภาษายุคนี้ไปแล้วกระมัง คือเราไม่จำเป็นต้องประกาศ Type ของตัวแปร เอาอะไรมารับก็ได้หมด เช่น
 somchai = "My father"  
 somchai = 65355  
 somchai = {}  

ตัวแปรทุกตัวเป็น Global 
ถ้าเราเขียนแบบนี้
 function createSomchai()  
   somchai = "My father"  
 end  
 function greetSomchai()  
   print("Hello"..somchai)  
 end  

พวกที่อยู่ข้างนอก ก็จะรู้จัก somchai ไปด้วย
createSomchai()
print(somchai)
greetingSomchai()

ถ้าไม่อยากให้เป็น Global ต้องใส่ local ไว้ข้างหน้า
 functon createSomchai()  
   local somchai = "My father"  
 end  

นอก function ก็จะไม่รู้จักตัวแปร somchai อีกต่อไป

Table เทพ
ใน Lua ไม่มี Array ไม่มี Class ไม่มี Struct ฯลฯ มีให้แต่ Table ซึ่งมันสามารถแปลงร่างเป็นสิ่งที่เราอยากให้มันเป็นได้
เป็น Array
 somchaiChildrens = {"Perseus", "Herculis", "Kratos"}  

เป็น Data object
 somchaiProfile = {  
   name="Somchai",  
   age=42,  
   isMarries=true  
 }  

เป็น Module
 somchai = {  
   function sleep() end  
   function wake() end  
   function wwork() end  
 }  

นอกจากนี้ก็มีพวก Data structure แบบอื่นๆอีกเช่น Set, Queue, Tree ซึ่งจะเอามาแนะนำในโอกาสต่อไปครับ รวมถึงเรื่องการ iteration ด้วย

Function ก็เป็น Type
หมายถึงว่าเราสามารถ pass function เข้าไปใน function อื่นๆได้ หรือจะเอาไว้ใน table ก็ได้เช่นเดียวกัน แล้วก็ evaluate function นั้นได้แบบเดียวกับ Javacript

 function evaluateFunction(anyFunction)  
   anyFunction()  
 end  

ไม่มี Try Catch
เพราะตัวภาษามันสร้างมาจาก C มันไม่มี Exception handling (= =')  ต้องใช้ฟังก์ชั่น pcall แทนครับ แบบนี้

 local result, message = pcall(greetSomchai())  

result จะเป็นตัวแปร boolean ถ้าเป็น true หมายถึง ไม่มี error ถ้าเป็น false หมายถึงมี error เกิดขึ้น
message ขึ้นอยู่กับ result ถ้าเป็น true ก็จะเป็นผลลัพธ์ที่ return มาจาก function (ถ้าไม่มีก็เป็น nil) แต่ถ้าเป็น false มันก็จะเป็น Message ของ error ที่เกิดขึ้น
ตัวอย่างวิธีการใช้ error ครับ

 function greetSomchai()  
  if somchai then  
  print("Hello "..somchai)  
  else  
  error("Who the hell is Somchai?")  
 end  

Silent fail
ถ้าไม่ร้ายแรงจริงๆ มันจะไม่ throw error ออกมาครับ อย่างเช่นหา Module ไม่เจอ, เรียกใช้ตัวแปรที่ยังไม่ถูกประกาศหรือเป็น nil อันนี้มันจะมี error ออกมา
แต่ถ้าเป็นพวกการเปิดไฟล์ ถ้าไม่มีไฟล์หรือใส่ path ผิดมันไม่ error นะครับมันจะ error ตอนที่เราจะเอามาใช้ ให้เราเดาสาเหตุกันเล่นๆ สนุกๆ  ^ ^ หรือ
สรุปว่าต้องเขียนดีๆ นะ เวลามีแมลงจะได้ไล้จับถูก

OOP ก็มีให้ใช้นะ
แต่วิธีการมันจะประหลาดหน่อย  อย่างกับทำอะไรฝืนธรรมชาติอยู่ ก็มันทำงานอยู่บนภาษา C นี่นะ ถ้าใช้แค่ใน Corona ก็ไม่จำเป็นเลยครับ

ยังมีที่อยากจะบ่นอีกแต่พอเท่านี้ก่อนละกัน สรุปแล้ว ถ้าถามว่าง่ายมั้ย ก็ง่ายจริง แต่สำหรับผู้ที่ผ่านภาษาอื่นๆมาแล้วมากกมายอย่าง Java, Python, PHP ... พอเริ่มจับไอ้ตัวนี้เราจะไปไม่เป็น ทำไม่ถูก พยายามเอาความรู้จากภาษาอื่นๆมาใช้กับ Lua ผลคือเละ ต้องปรับตัวหน่อยครับ ลืมๆ ไอ้ที่เคยทำมาไปซะ เราทำงานกับภาษา Lua ก็ต้องเขียนโปรแกรมสไตล์ Lua ครับ ตัวผมเองใช้เวลาอยู่หลายเดือน ถึงจะเริ่มเข้าที่ แต่จนถึงก็ยังไม่ได้ดีเด่อะไรหรอกนะ ยังขาดอะไรอีกเยอะ

No comments:

Post a Comment