Avatar
veervrrr
45205774f0d238ab6b1e8f80a38a2d554cdf3c87838467bbc871181b674f0c71
Left Localized Lisper

ใช้ HHKB จนจะคล่องแล้ว

Advice ไปผลิต keyboard อยู่หรือไง

เคยลอง Void Linux อยู่พักนึงดี runit ก็ใช้ง่าย แต่ตอนนี้กลับมาใช้ Debian Stable ธรรมดา

เปลี่ยน font เป็น TLWG Typo แบบหนา

ลองจาก shell ใน Emacs อีกที

อยากโพสต์จาก Emacs

Lume เอาได้ ถึงรูปโปรไฟล์ไม่มาก็เถอะ

lume เอาได้

ลองจาก Lume

"โปรดเกล้าฯ แต่งตั้ง พล.อ.ประยุทธ์ เป็นองคมนตรี โดยไม่ปรากฏชื่อผู้รับสนองพระบรมราชโองการ " https://prachatai.com/journal/2023/11/107029

นอกจาก SQL แล้วก็มีภาษาอื่น ๆ ที่ใช้ได้คล้าย ๆ กัน เช่น datalog และ SPARQL ซึ่งมักจะใช้กับข้อมูลที่ไม่เป็น table ของ datalog ผมนึกไม่ออกเท่าไหร่ แต่ก่อน SPARQL ผมก็นึกไม่ออกจนได้มาเจอข้อมูลใน Wikidata ซึ่งมันหลากหลายมาก ๆ ถ้าจะเป็นใน table แบบ SQL โดยที่มี table หลายหลายชนิดน่าจะยากเลย เพราะก็จะมี table ใหม่ ๆ เกิดขึ้นตลอด ไม่เห็น RDF ที่มองเป็นแค่ triple

Concurrency นอกจากจะใข้ภาษาที่คิดมาแล้วว่าจะทำ concurrency อย่างไร อีกทางนึงก็ใช้ภาษาที่ไม่ได้ลงรายละเอียดมากเกินไปแบบ SQL ก็ได้

SQL เป็นการเขียนบอกว่าเอา data ออกมาตามเงื่อนไขอะไร แต่ไม่ไปเจ้ากี้เจ้าการว่าจะต้องไปหามาด้วยวิธีไหน ทำให้ implementation มีอิสระมาก อาจจะใช้ CPU 1 คอร์ด็ได้ ใช้ CPU หลาย ๆ ตัวมาช่วยกันก็ได้ หรือใช้ GPU ช่วยก็ได้ อาจจะใช้คอมพิวเตอร์หลาย ๆ เครื่องมาช่วยกันหาข้อมูลตามคำสั่ง SQL คำสั่งเดียวก็ได้

แต่เอาจริง Lisp ที่เป็นที่นิยมในวงการศึกษาส่วนมากก็เห็นใช้ Racket ไม่ใช่ ISLisp อยู่ดี

นอกจาก Common Lisp ที่เป็นมาตรฐาน ANSI ของสหรัฐอเมริกาแล้ว เพิ่งอ่านมาไม่กี่วันนี้ว่า ISLisp เป็นมาตรฐาน ISO/IEC ซึ่งดูอินเตอร์กว่า รายละเอียดก็ต่างกันนิด ๆ หน่อย ๆ ในแง่การศึกษาอาจจะใช้ ISLisp ก็ได้ แต่ในทางปฏิบัติอาจจะลำบากหน่อย เพราะ library น้อย และ implementation ยังไม่ได้ผ่านการใช้งานจริง ๆ จัง ๆ เท่าไหร่นัก

Clojure เป็นภาษาในตระกูล Lisp ที่อายุเพิ่งได้ 16 ปี ทำให้คิดเรื่อง concurrency มาแล้วเป็นอย่างดี ไม่ได้เป็นแค่ระบบ lock และแก้ state ปัญหาของระบบที่ lock และมาแก้ state เอาอย่างแรกคือมันเหนื่อย และอาจจะพลาดได้ บางทีคนเขียนอาจจะไม่ได้เข้าใจเลย เวลามันพังจะเป็นแบบรันได้บ้างไม่ได้บ้างทำให้งงไปใหญ่

Clojure ตัดปัญหาแต่แรกเลยว่า data structure ที่ใช้เป็นแบบ persistent/immutable แต่แรก ดังนั้นโอกาสที่จะไปแก้ตัวแปรเดียวกันจากหลาย ๆ thread โดยที่ไม่ได้คิดอะไร มันทำไม่ได้แต่แรก

ส่วนถ้าอยากให้แก้ค่ากันได้ระหว่าง thread ก็ต้องใช้คำสั่งพิเศษ

https://clojure.org/about/concurrent_programming

สิ่งที่ Common Lisp ซึ่งเป็น spec จากยุค 80s ไม่มีด้วย คือพวกเรื่อง multi-threads อย่างไรก็ตามในทางปฏิบัติก็ใช้ได้เพราะมี extension ของ implementation ต่าง ๆ เวลาใช้งานก็มี bordeaux-threads มาครอบให้ portable อีกที ก็ใช้งานได้

เทียบกับ Python และ JavaScript ที่เพิ่งเขียนขึ้นมาในยุค 90s กลายเป็นว่า Common Lisp ไม่มี global lock หรือระบบที่บังคับให้รันแบบ event driven

สรุปว่าในทางปฏิบัติ Common Lisp ก็ทำ type check ตอน compile รวมถือสามารถ declare type ได้ และ compile ก็มีระบบ type inferenece รู้ type ได้เองจากค่าคงที่ หรือบาง function ไม่จำเป็นต้องประกาศทั้งหมด

นอกจากจะใช้หาจุดผิดแล้วก็ยังเป็นการเพิ่มประสิทธิภาพด้วย ลด type check ตอนรันทำให้ความเร็วเพิ่มขึ้น

ที่สำคัญคือ SBCL ทำได้มาหลายปีแล้ว อาจจะถึง 20 กว่าปี ถ้านับรวม ๆ CMUCL ด้วย ไม่ใช่ว่าเพิ่งมาทดลองทำ