- Elixir เป็น Functional Language ก็จริง แต่ไม่ได้เป็น pure function แบบ Haskell คือฟังก์ชันมี side effect ได้ แต่การจัดการ side effect ของ Elixir ต่างออกไปจากภาษาอื่น
- ต้องคิดเรื่อง Data transformation มากกว่าเรื่อง Function composition คือถ้าเป็น pure function แบบ Haskell เนี่ย ส่วนใหญ่ต้องคิดว่าเราจะ compose ฟังก์ชันยังไง เพื่อให้ได้กลไกทำงานตามที่ต้องการ ในขณะที่ เวลาใช้งาน Elixir เราต้องคิดแต่ละขั้นตอน ที่เราจะเรียกฟังก์ชันว่า Data เราจะถูก transform ไปยังไงในแต่ละขั้นตอน
- เพื่อส่งเสริมให้คิดและออกแบบการทำงานโดยคิดถึงเรื่อง Data transformation ให้มากที่สุด ดังนั้น Elixir จึงไม่มี mutable variable แต่ตัวแปรเป็นแค่ชื่อที่ binding ไปหา data ที่ไม่สามารถ mutate อะไรได้เอง แต่ต้องอาศัย function เพื่อ transform ไปเป็น data แบบใหม่
- ผลัก Side Effect ต่างๆออกไปเป็น process ทีนี้พอ function นั้นเน้นเรื่อง data transformation แล้วจะออกแบบระบบที่ต้องการให้มี state หรือยุ่งกับ IO กับ Network ได้ยังไงนั้น สำหรับ Elixir เลือกที่จะทำให้สิ่งที่ต้องการ state, IO หรือ Network แยกออกเป็น long live process ใหม่ แล้วค่อยคุยกันผ่าน message ในเมื่อเป็น process ก็ทำให้มี state ได้ ระบบ IO ก็คุยกันผ่านการส่ง message หา process ที่ควบคุม state ของ IO อยู่ สำหรับ Network ก็เช่นกัน
- OTP Component ต่างๆแท้จริงแล้วถูกสร้างด้วย Process จากที่ได้ลองไปแงะโค้ดของ Application, Supervisor, GenServer ดูแล้ว กลไกพวกนี้จริงๆแล้วก็คือ Process นั่นเอง ที่ถูกออกแบบ pattern การสื่อสารกัน การ Link process การ Monitor process เอาไว้ให้แล้ว เราแค่ implements ส่วน callback function ตามที่ต้องการ
- Macro คือ AST transformation พอเข้าใจ Macro แล้วก็ไม่ได้ยากอะไร มันคือฟังก์ชันที่จะ transform AST จากแบบหนึ่ง ไปเป็นอีกแบบ หนึ่ง ซึ่งสำหรับ Elixir AST นั้นก็อยู่ในรูปแบบ Data structure พื้นฐานของ Elixir เองด้วย สุดท้ายแล้ว compiler ก็จะ compile AST เป็น beam ให้อีกที
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (3)
Clojure เป็นแบบไหนครับ ?
ประมาณแบบที่ Rich Hickey youtu.be/-I-VpPMzG7c พูดในนี้ครับ
เป็น value 😅
talk transcript