Content from 2016-11

เกี่ยวกับภาษา Lisp

posted on 2016-11-13

ที่มา

สมัยหนุ่ม ๆ ผมเห็นคำว่า Lisp ผ่านตาบ่อย ๆ ทั้งความเกี่ยวข้องกับ Logo AI หรือแม้กระทั่ง AutoCAD ก็เลยอยากจะเรียน

ต่อมาก็ยังได้ยินเรื่อง Functional Programming ก็เลยรู้สึกว่าน่าสนใจเข้าไปใหญ่

อย่างไรก็ตามสมัยหนุ่ม ๆ จะหาอะไรก็ลำบาก พอมาสมัยนี้จะหาอะไรมาเล่นก็ง่ายขึ้น

ประเด็นที่น่าสนใจ (สำหรับผม)

  1. Lisp เป็น High-level programming language ภาษาที่ 2 ของโลก หรือว่าถ้าจะมีอะไรมาแทรก ๆ ก็ยังเป็นภาษาแรก ๆ อยู่ดี
  2. Lisp มาพร้อมกับ Garbage collector แต่แรกตั้งแต่ค.ศ. 1959
  3. ภาษาแนว Functional Programming ทั้งหมดมีส่วนเกี่ยวข้องกับ Lisp
  4. ทุกอย่างใน Lisp มีพื้นฐานมากจาก List
  5. Lisp ในแง่มุมวงเล็บ
  6. Lisp ในแง่มุม dynamic type

เกี่ยวกับผม

จริง ๆ แล้วผมเขียน Clojure แต่ว่าไม่พูดถึง Clojure เพราะว่าไม่แน่เรื่อง Persistent vector

ผมไม่เข้าใจ lambda calculus ไม่เข้าใจ Category theory ไม่ใช่ว่าไม่สนใจแต่ว่าอ่านแล้วยังไม่รู้เรื่องแล้วก็จะมาเล่าที่หลัง

List

ค.ศ. 2016 นอกจากจะเขียน Clojure แล้วผมก็ได้ลอง Common Lisp ด้วย ถ้าว่าให้เฉพาะเจาะจงก็คือใช้ SBCL รู้สึกว่ามันไม่สะดวกเท่า Clojure แต่ได้สัมผัส List มากกว่า

พอศึกษาไปสักพักแล้วรู้สึกว่าใน Lisp สิ่งที่เป็นพื้นฐานกว่า List อีกก็คือ Cons cell ที่ผมเคยบันทึกไว้แล้ว

พอทราบเรื่อง Lisp แล้วเราก็จะมาพูดเรื่อง Singly Linked List ได้สบาย ๆ

ความเชื่อมโยงกับ Clojure OCaml และ Haskell

จริง ๆ ผมก็ไม่เคยเขียน Lisp แบบเดิม ๆ เอาตัวเก่าที่สุดที่เคยใช้ก็คือ Common Lisp

สิ่งที่พบคือ Clojure OCaml และ Haskell มี cons cell และ singly-linked list ติดมากับภาษาทั้งหมด เพียงแต่ว่าใน Haskell คำสั่ง cons เปลี่ยนเป็น : (colon) และใน OCaml ใช้ :: (colon สองที่

นอกจากนั้นในพวก Haskell และ Clojure ยังมีสิ่งที่เรียกว่า lazy sequence ของ Haskell ผมไม่ได้อ่านละเอียด แต่ว่า Clojure นี่แน่ชัดว่า lazy sequence ก็ทำงานอยู่บน cons cell เหมือนกับ list แต่ว่า เวลาสั่ง cdr หรือ rest มันไม่มีประมวลผลเก็บไว้ก่อน สั่ง cdr และ rest ทีนึงมันก่อนไปคำนวณหาหัว list มาให้ แต่ถ้าเป็น list ธรรมดาทุกอย่างใน list ถูกคำนวณเก็บไว้ใน memory อยู่แล้ว

นอกจากเรื่อง lazy sequence แล้ว Clojure ยังต่างออกไปจาก Lisp เดิม ๆ คือ data structure ที่ใช้เป็นหลักไม่ใช่ singly linked list แล้วแต่เป็น persistent vector แทน ซึ่งคุยกับ @visibletrap แล้วก็สรุปว่ามาจากวิทยานิพนธ์ของ CMU อีกที

แต่ว่า Lisp ก็ยังเป็นภาษาแบบที่ยังมี side-effect ได้อยู่เวลาเขียน IO อย่างใน Common Lisp ก็สั่ง (format nil "toto") แบบนี้ได้เลย ไม่ต้องมี IO Monad แบบ Haskell นอกจากนั้นก็ยัง assign ค่าตัวแปรแบบเถื่อน ๆ อย่าง (setf var1 "titi") แบบนี้ก็ได้ ไม่ได้บังคับเป็น Functional Programming

ความเชื่อมโยงกับ Python และ Ruby

ถ้าดูจากตำแหน่งวงเล็บแล้ว Python และ Ruby อาจจะไม่ค่อยเกี่ยวกันเท่าไหร่ แต่ว่าจริง ๆ ก็มีเรื่อง dynamic type ที่ว่าไปแล้วก็คล้าย ๆ กันมาก

แต่ว่าสิ่งที่ Python เรียกว่า list มันไม่ใช่ list แบบใน Lisp แต่เป็น vector หรือเหมือน array ใน Pascal ใน C

เพิ่มเติม

สุดเด่นอีกอย่างของ Lisp คือใช้กับ REPL แล้วเนียนมาก ๆ สามารถรัน ๆ โปรแกรมไปแล้วอยากเปลี่ยนแค่บาง function แล้วรันใหม่ ได้โดยไม่ต้อง reload ทุกอย่างขึ้น memory ทำให้สะดวกมาก ๆ

จริง ๆ หลาย ๆ ภาษาก็พยายามจะมี REPL แต่ว่าใช้จริง ๆ มันไม่ค่อยสะดวก เหมือน Lisp หรือ Clojure ที่วงเล็บมันช่วยกำหนดของเขตของสิ่งที่รับจะ eval ใหม่ได้เลย รูปแบบการเขียนโปรแกรมของ Lisp มันก็เหมือนได้ มี function แยก ๆ เลยกันเลย เคยพยายามใช้กับ Ruby ก็มึน ๆ เหมือนกันพอพยายามจะ eval เฉพาะบาง method ใน class ก็จะเริ่มงง ๆ แล้ว

Emacs+Cider screenshot

ในรูปเป็นของ Clojure นะครับใช้ Emacs กับ Cider แต่ใช้ Lisp จริง ๆ ก็ได้เพียงแต่ใช้ SLIME แทน หรือจะไม่ใช้ Emacs ไปใช้พวก Cursive ก็ได้สำหรับ Clojure หรือแม้แต่ vscode

ผมว่ามันเป็นความสะดวกอีกขั้นที่เลย IDE ไป อันนี้น่าจะ demo ให้ดูเป็น video ได้ในอนาคต

คุยกับผม

ทลายกำแพงภาษาเพื่อรากหญ้า

posted on 2016-11-12

ที่มา

ความสามารถทางภาษาอังกฤษของประเทศไทยอยู่อันดับที่ 62 จาก 70 แต่ก่อนผมก็ไม่ค่อยเชื่อจนไปซื้อซิมแล้วขอให้พนักงานปรับค่าให้ หลังจากผ่านไปประมาณ 5 นาทีพนักงานบอกว่าช่วยเปลี่ยนเป็นภาษาไทยให้หนูหน่อย ตั้งแต่นั้นมาผมก็เปลี่ยนความคิด

ไก่กับไข่

  • หักดิบใช้ภาษาอังกฤษไปเลย
  • แปลภาษาไทยให้พอใช้ได้แล้วค่อยใช้คอมพิวเตอร์หรือมือถือเรียนภาษาอังกฤษ

ผมเลือกแปลก่อนเพราะว่า:

  1. พอใช้มือถือหรือคอมพิวเตอร์ได้แล้วมีโปรแกรมมีเว็บให้เรียนภาษาอังกฤษเยอะแยะ
  2. ความปลอดภัย: ท่าที่ว่ากดมั่ว ๆ หรือกด OK ไปเลย โดยไม่อ่านอาจจะซวยได้

เลือกโครงการไหน

  1. ความเป็นเจ้าของ
  2. โปรแกรมที่อานิสงส์เยอะ ๆ

ถ้าเลือกได้ผมจะแปลโปรแกรมที่เป็นของผมเอง แต่ว่าโปรแกรมที่ผมเขียนเองมันเป็นภาษาไทยอยู่แล้ว ไม่ก็ไม่ได้ทำมาให้รากหญ้าใช้ ก็เลยขยับมาที่โปรแกรมที่เป็นเป็นสาธารณะหรือเป็นซอฟต์แวร์เสรีนั่นเอง

ที่คิดว่าน่าจะใช้มาก ๆ ก็คือโปรแกรมเปิดเว็บก็มีอยู่ 2 ตัวคือ Chrome กับ Firefox ผมเลือก Firefox เพราะว่าเห็นเช็งกับท็อปแปลอยู่แล้ว

Firefox มันยังมีอนาคตไหม ?

ท็อปบอกว่า "ยิ่งกว่ามีอีกครับ"

Gecko ที่ใช้มานานกำลังถูกเปลี่ยนไปเรื่อย ๆ ผ่านโครงการ Quantum ที่เอาชิ้นส่วนใหม่ ๆ ที่เขียนด้วยภาษา Rust มาใส่ เร็ว ๆ นี้ก็น่าจะวาดหน้าเว็บโดยเอา GPU มาช่วยด้วย เป็นต้น

ภาษา Rust พัฒนามามากกว่า 6 ปีแล้ว ประเด็นหลักเลยก็คืออยากได้ภาษาที่เขียนโปรแกรมแล้วประสิทธิภาพสูสีกับ C/C++ แต่ลดโอกาสที่นักพัฒนาจะทำพลาดลง อีกประเด็นหนึ่งคือเขียนโปรแกรมที่ทำงานพร้อม ๆ กันได้ง่ายขึ้น

คนอื่น ๆ แล้วก็ผมด้วยก็หวังว่า Firefox รุ่นใหม่ ๆ ที่มีฐานอยู่บน Rust มันจะทำงานได้ดีขึ้นด้วย

ทำไมต้องมาแปลเอง ?

ปล่อยนักแปลอาชีพที่จ้างมาทำไหม ทำไมต้องมาแปลเอง ? ผมคิดว่าไม่ปล่อยดีกว่า เพราะว่าคิดว่าเราแปลดีกว่า เช่น เราไม่แปลว่า "จดจำเว็บนี้ไหม" แล้วให้เลือกว่า "ไม่เคย" หรือว่าสองทางให้เลือกคือปุ่ม "ยกเลิก" กับปุ่ม "ยกเลิก"

บางทีเราอาจจะพลาด แต่เราก็แก้ได้

เริ่มแปล

Pontoon

หลังจากผ่านอะไรมามากเดี๋ยวนี้ถ้าจะแปลก็เข้าไปที่ Pontoon ได้เลย แต่เพื่อที่ว่าจะได้ไม่งงผมเลือกโครงการให้เลยอันนี้เป็นการเว็บของ Mozilla สำหรับคนที่เริ่มแปลแรก ๆ ก็จะเป็นการให้เสนอคำแปล (suggest) ไปก่อนแล้วจะมีคนมาตรวจอีกทีซึ่งในกรณีก็คือ ท็อป เช็ง และ @nutmos เอง

เวลาแปลเราค้นคำแปล ๆ เก่า ๆ ได้ด้วย ถ้าไม่ได้มีอะไรผิดพลาด หรือว่าเป็นการแปลความหมายที่ต่างกัน เราก็ควรจะแปลให้เหมือน ๆ กันไว้ก่อน ผู้ใช้จะได้ไม่งง ถ้าใช้คำนั้นทีคำนี้ทีก็จะงงได้

Pontoon มีตัวช่วย 3 อย่างคือ 1. หาคำแปลที่เคยแปลมาให้เลย 2. ใช้เครื่องแปลภาษามาด้วย 3. ดูจากภาษาอื่นเช่น ภาษามลายู ภาษาลาว

Pontoon ตอนนี้เวลาแปลบางอย่างมันสามารถแปลแบบเห็นหน้าตาจริง ๆ ได้เลย จะได้ไม่แปลยาวเกินจนล้น แต่ว่าก็ยังใช้ได้แค่บางงานเช่นแปลหน้าของ Pontoon เอง

Style guide

แต่ว่าพอไปเปิดดูแล้วอาจจะสงสัยว่ามันต้องมีหลักการหน่อยไหม ก็เข้าไปศึกษาในนี้ได้ครับ

Transvision

นอกจากสองอย่างนี้แล้วก็ยังมีเว็บที่ช่วยค้นหาคำแปลเก่า ๆ https://transvision.mozfr.org/

มุมมองของผม

อาจจะมีคนถามว่าควรแปลแบบคำต่อคำเลยหรือเปล่า ผมคิดว่าไม่จำเป็น ตัวตั้งสำหรับผมคือคิดถึงคนที่พูดภาษาไทยที่เขาอ่านภาษาอังกฤษไม่ออกหรือออกน้อย ประเด็นหลักในการแปลผมอย่างที่พี่เด่นสินบอกไว้คือมุ่งที่การสื่อสารก่อนเป็นอันดับแรก

นั่งแปลด้วยกัน

ครั้งหน้านัดกันที่ Hubba เอกมัยซอย 4 วันที่ 25 ธันวาคม พ.ศ.2559 ครับ ดูบรรยากาศครั้งก่อนเมื่อเดือนกันยายนได้ที่นี่ครับ

ตัวอย่าง

sync จะแปลว่าอะไรดี เราทราบกันดีว่าย่อมาจาก synchronous พอลอกไปคนดูว่า แปลว่าอะไรก็ได้ "สมวาร" บ้าง "ประสานเวลา" บ้าง ซึ่งอภิปรายกันแล้วก็ได้มติว่าแปลไปก็ไม่รู้เรื่องอยู่ดีจึงทับศัพท์ไปว่า "ซิงค์" แต่ก็ต้องพิจารณาประเด็น Sync ที่ว่าเป็นชื่อเฉพาะอันนี้เราจะใช้ Sync ตามภาษาอังกฤษไปเลย

พวกนี้ก็เป็นประเด็นที่จะอภิปรายกันต่อไปได้ว่ามีคนไหนประโยคไหนควรจะแปลแบบไหนดี

พื้นที่ออนไลน์

พบกันที่ได้ https://www.facebook.com/groups/mozth

มีบางท่านถามมาว่าควรจะใช้ Slack หรือไม่ ผมว่าก็อาจจะดีแต่ว่าโอกาสที่คนจะมาร่วมก็คงน้อยลง IRC ดีไหมเป็นระบบเปิดด้วย แต่เหตุผลก็คงจะเหมือนเดิมคนมีส่วนร่วมก็จะน้อยลงอีก

อนาคต

มีโครงการใหม่ชื่อ L20N เป็นการเล่นคำที่มาจาก L10N คูณ 2 ซึ่ง L10N ก็ย่อมาจาก Localization หรือการทำให้เป็นท้องถิ่นอีกที แต่พูดให้แคบ ๆ ลงหน่อยก็คือการแปลนี่เอง

ผมดูคร่าว ๆ แล้วส่วนที่น่าสนใจสำหรับการมีภาษาไทยก็มี advance selector อันนี้มันอาจจะมาช่วยลดงานเราได้ เช่น

  • คุณไม่มีอีเมลที่ยังไม่ได้อ่าน
  • คุณมีอีเมลที่ยังไม่ได้อ่านหนึ่งฉบับ
  • คุณมีอีเมลที่ยังไม่ได้อ่าน 8 ฉบับ

พวกนี้จะเอามารวมกันเป็นก้อนเดียวได้หรือเปล่าใน L20N ก็เป็นเรื่องที่อาจจะต้องดูต่อไป

นอกจากการแปล

ตัดคำ

ตัววาดเว็บตัวใหม่ ได้แก่ Servo ก็กลับมามีปัญหาอยู่ ก็อยู่ในช่วงพิจารณาว่าจะใช้ libicu ดีไหม หรือจะทำอย่างไรดี ประเด็นพวกนี้อาจจะน่าสนุกที่ว่าไม่ได้ทำเฉพาะภาษาไทย ลาว ญี่ปุ่น ฯลฯ ก็ใช้โปรแกรมส่วนเดียวกันเลย ตามไปดูได้ที่ github

อื่น ๆ

นอกจากการตัดคำแล้ว การเลือกฟอนท์ใน Servo ก็ยังมีอะไรตรวจสอบหรือแก้อยู่เสมอ ๆ ถ้าอยากลองเขียน Rust ดูกับนักพัฒนาที่อื่น ๆ ในโลกดูบ้างก็อาจจะเป็นโอกาสที่ดี

บรรยากาศที่บรรยายเรื่องนี้

BCBK7

คุยกับผม

This blog covers Blog, Coleslaw


Unless otherwise credited all material Creative Commons License by Vee Satayamas