Skip to content

Instantly share code, notes, and snippets.

@neizod
Last active December 11, 2015 09:59
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save neizod/4583850 to your computer and use it in GitHub Desktop.
ML, Racket, Ruby Lecture @ Cousera

เมื่อพูดถึงภาษาคอมพิวเตอร์

  • syntax: เขียนยังไงให้ computer เข้าใจเรา?
  • semantics: ภาษาที่เราเขียนมันมีขั้นตอนการทำงานยังไง?
  • idioms: ปรัญชาเบื้องหลังภาษานั้นๆ
    • เช่นภาษา python มีปรัชญาว่า มันควรมีเพียงวิธีเดียว (ที่ดีที่สุด) ในการเขียนโปรแกรมให้ทำงานอยากเดียวกัน (เพื่อให้ programmer สามารถอ่าน code คนอื่นได้ง่าย)
    • ส่วนภาษา ruby มีปรัชญาตรงนี้กลับกัน คือจะเขียนยังไงก็ได้ให้มันทำงานได้ (programmer จะสนุกกับการเขียนโปรแกรม... แต่ programmer คนอื่นมาอ่านรู้เรื่องหรือเปล่าก็อีกเรื่อง)
  • libraries: code ที่คนอื่นเขียนไว้ให้ใช้
  • tools: เครื่องมือช่วยสร้างโปรแกรมในภาษานั้นๆ เช่น repl, debugger, ide

สายศึกษาภาษาแบบ pure จะไม่สนใจ 2 ข้อหลังเท่าไหร่ แต่ถ้าจะเอาภาษาไปใช้ทำงานจริงก็ควรดูให้ครบ

ML

  • ตัวแปรเป็นแบบ static strong
    • static คือ โปรแกรมจะต้องรู้ type ของตัวแปร/ฟังก์ชันตั้งแต่ตอน compile
      • เช่น เขียนฟังก์ชัน f จะต้องรู้ตั้งแต่ตอนเขียนว่า ฟังก์ชันนี้จะรับตัวแปร type อะไร และคืนค่าเป็น type อะไร
    • strong คือ ตัวแปรชนิดไหนก็สามารถทำงานได้กับฟังก์ชันชนิดนั้นๆ ไม่สามารถทำงานข้ามกันได้
      • เช่น จะหาค่าของ 'a' + 1 ไม่ได้ (แต่ถ้าเป็นในภาษา C ทำได้)
  • นอกจากนี้ ตัวแปรยังเป็น immutable คือสร้างขึ้นมาครั้งเดียว ห้ามเปลี่ยนค่า
    • แต่ทำ val a = a + 1 ได้ โดยที่ a ฝั่งขวามือจะโดนทำให้หายไป (ไม่สามารถเรียกมาใช้ได้อีก) เรียกกระบวนการนี้ว่า shadowing
  • เก็บข้อมูลที่มี type เดียวใช้ list
    • ตรวจว่า list l ว่างหรือไม่โดย null l
    • ข้อมูลตัวแรกสุดของ list คือ hd l
    • ข้อมูลตัวที่เหลือยกเว้นตัวแรกคือ tl l
  • เก็บข้อมูลที่มี type หลายๆ type ปนกันใช้ tuple
    • เข้าถึงสมาชิกตัวที่ n ของ tuple t ได้โดยคำสั่ง #n t
  • ฟังก์ชันตัวแปรเดียวเรียกใช้ไม่ต้องมีวงเล็บครอบตัวแปร
  • ฟังก์ชันหลายตัวแปรใช้วงเล็บครอบตัวแปร ... หรือจะมองว่ามันเป็นการเรียกฟังก์ชันที่มีตัวแปรเป็น tuple ก้ได้
  • เนื่องจากข้อมูลเป็น immutable (ไม่สามารถเขียน for(i=0;i<10;i++) อะไรแนวนี้ได้) ฟังก์ชันที่วน loop ต้องเขียนแบบ recursive
  • ใช้ let <exp> in <exp> end เพื่อกำหนด locals scope ของตัวแปร
    • จะเขียนฟังก์ชันในฟังก์ชันก็ได้ ไม่มีปัญหาอะไร
  • if <exp> then <exp> else <exp> ต้องมีส่วน else เสมอ (และต้องคืนค่าเป็น type เดียวกับส่วน then ด้วย)
  • เนื่องจากมันต้องคืนค่าเป็น type เดียวกัน แต่บางกรณีก็ไม่มีค่าให้คืน (เช่น hd []) ดังนั้นต้องใช้สิ่งที่เรียกว่า option
    • คืนค่า NONE เมื่อไม่มีค่าให้คืน
    • คืนค่า SOME v เมื่อมีค่าให้คืน (v เป็น type อะไรก็ได้) ... โดยเวลาจะเอาค่านั้นมาใช้ให้สั่ง valOf (SOME v)
  • เปรียบเทียบลำดับด้วย =, <>, <, >, <=, >=
    • หมายเหตุว่า float ใน ml ไม่มีเครื่องหมาย =, <> ให้ใช้
  • ดำเนินการบูลีนด้วย andalso, orelse, not
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment