LISP — ภาษา 67 ปีก่อน ที่ยังมีชีวิตอยู่ในทุกภาษาที่คุณเขียน
คุณเขียน if-else ทุกวัน คุณรัน code ใน terminal แล้ว REPL มันตอบกลับมา คุณ lambda ใน Python, arrow function ใน JavaScript, closure ใน Rust — ทั้งหมดนี้ เกิดจากภาษา LISP และที่น่าทึ่งคือ... LISP ไม่เคยถูก planned ให้เป็นภาษาโปรแกรมด้วยซ้ำ กระดาษแผ่นเดียวที่เปลี่ยนโลก 1958 — John McCarthy เริ่มพัฒนาแนวคิด LISP ที่ MIT เมษายน 1960 — McCarthy วัย 32 ตีพิมพ์ paper ใน Communications of the ACM (vol. 3, หน้า 184-195) "Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I" ใน paper 12 หน้านี้ McCarthy เสนอไอเดียของภาษาโปรแกรมที่: จัดการกับสัญลักษณ์ (symbols) ไม่ใช่แค่ตัวเลข ใช้ recursion เป็นตัวควบคุมการทำงาน แทนการใช้ loop เก็บ function เป็น first-class citizen — ส่งต่อกันได้เหมือนข้อมูล McCarthy เขียนมันขึ้นมาเป็น ทฤษฎีทางคณิตศาสตร์ — ไม่ได้ตั้งใจ implement แต่ก่อน paper จะตีพิมพ์ — ระหว่างปี 1958-59 Steve Russell นักศึกษา grad student อ่าน manuscript "I told him, 'Steve, why don't you program this eval?' and he said to me, 'Oh, I misread what you meant. I thought you meant I should implement the interpreter.'" — John McCarthy, ACM interview นักศึกษา เขียน interpreter ให้ทฤษฎีของอาจารย์ — และภาษา LISP ก็เกิด code ตัวแรกที่ Russell เขียน ใช้เวลาแค่ 2-3 วัน (ตัว LISP 1.5 Programmer's Manual ฉบับเต็มออกตามมาทีหลัง ในปี 1962) สิ่งที่ LISP สร้างไว้ (และเราใช้มันทุกวัน) 1. if-then-else ย้อนไปปี 1958 — ภาษาส่วนใหญ่มีแค่ GOTO กับ branch แบบ assembly McCarthy ให้กำเนิด cond (conditional expression) — จุดเริ่มต้นของ if-else ที่เราเห็นแทบจะในทุกภาษา (cond ((< x 0) 'negative) ((= x 0) 'zero) (t 'positive)) C, Java, Python, JavaScript, Go, Rust — ภาษาเหล่านี้ได้รับมรดกนี้มาหมด Conditional branching ในทุกภาษาสมัยใหม่มีโครงสร้างแบบเดียวกับที่ McCarthy คิดไว้ตั้งแต่ก่อนมนุษย์ไปดวงจันทร์ 2. Garbage Collection ก่อน LISP — programmer จัดการ memory เอง 100% ทุกบรรทัดของ malloc และ free LISP สร้าง garbage collection ตัวแรกของโลก — ต้นฉบับคือ mark-and-sweep algorithm (implement โดย Daniel Edwards นักศึกษา MIT) ทุกวันนี้ GC คือ default ในเกือบทุกภาษา high-level — Java, Python, JavaScript, Go, C#, Ruby ล้วนใช้แนวคิดนี้ต่อยอด 3. Lambda — function เป็นข้อมูล (lambda (x) (* x x)) LISP ทำให้ function เป็น first-class citizen — ส่ง function เป็น parameter ได้, return function ได้, เก็บลง variable ได้เหมือนเป็น string หรือ integer นี่คือต้นทางของ: JavaScript — arrow function (x) => x * x (Brendan Eich ถูกจ้างไป Netscape เพื่อทำ Scheme ใน browser — แต่ management เปลี่ยนใจให้ syntax เหมือน Java) Python — lambda x: x * x Ruby — blocks, procs, lambdas (Matz บอกว่า "Ruby was a Lisp originally, in theory") Java — lambda expressions (Java 8, 2014 — ใช้เวลา 19 ปีกว่าจะตามทัน) C++ — lambda (C++11) 4. REPL — ปรัชญา "คุยกับภาษา" Read-Eval-Print Loop — LISP ให้กำเนิดมันในทศวรรษ 1960s ก่อนหน้านั้น: เขียน code → compile → run → debug → repeat หลังจากนั้น: พิมพ์ expression → กด enter → เห็นผลทันที ทุกวันนี้ถ้าคุณเปิด Python REPL (>>>), Node.js console, Ruby IRB, Chrome DevTools, Rust Playground, หรือ Elixir IEx — คุณกำลังนั่งอยู่ในห้องเรียนเดียวกับ programmer LISP เมื่อ 60 ปีที่แล้ว 5. Homoiconicity — code = data '(+ 1 2) ; ← นี่คือ list (eval '(+ 1 2)) ; ← นี่คือ code ที่รัน list LISP เขียนด้วย... LISP — code กับ data ใช้โครงสร้างเดียวกัน (S-expression) แปลว่า โปรแกรมแก้โปรแกรมตัวเองได้ — ไม่ต้องใช้ parser แยก AST, ไม่ต้องเขียน transformer นี่คือรากฐานของ macro system ที่ทรงพลังที่สุดในสายภาษาโปรแกรม ไม่มีภาษาไหนทำได้เต็มระบบเท่า LISP — แต่แนวคิด "code as data" ไปอยู่ใน: Elixir — macro (รับ AST, คืน AST) Julia — macro + multiple dispatch ("We want a language that's homoiconic, with true macros like Lisp" — Julia manifesto, 2012) Rust — macro system (proc macro) Clojure — macro (ของ Clojure ก็คือ LISP dialect นั่นเอง) มรดกจาก LISP LISP (1958) ├── Scheme (1975) — minimalist, lexical scoping │ ├── JavaScript (1995) — Brendan Eich ตั้งใจทำ Scheme-like ใน browser │ │ └── arrow functions, closure, first-class functions │ └── Racket (1995) — ภาษาเพื่อการสอนและการวิจัย ├── Common Lisp (1984) — ภาคอุตสาหกรรม, pragmatic │ └── Emacs Lisp (1985) — editor scripting (GNU Emacs) ├── Clojure (2007) — LISP บน JVM, immutable by default │ └── จุดประกาย functional programming ในโลก enterprise └── Python, Ruby, Elixir, Julia, Rust, Swift — ทุกภาษาเอาแนวคิด LISP ไปปรับใช้ ทำไม LISP ถึงไม่ใช่ภาษาหลักวันนี้ ทั้งที่สร้างนวัตกรรมเกือบทุกอย่างที่เราใช้ — ทำไม LISP ถึงไม่ชนะ? Paul Graham (ผู้ก่อตั้ง Y Combinator, แฟนพันธุ์แท้ LISP) อธิบายไว้ใน essay "Beating the Averages": Syntax ต่างจากทุกอย่าง — วงเล็บทำให้คนกลัว ไม่มี standard library ในยุคแรก — Common Lisp มากอบกู้ในปี 1984 แต่ช้าไปแล้ว AI Winter — LISP ผูกกับ AI research; เมื่องบ AI หาย LISP ก็หายด้วย Tooling — compiler ช้า, IDE ห่วย (เทียบกับ Visual Studio ยุค 90s) Graham ยืนยันว่า: "Lisp is a language that was discovered, not invented." ฝั่งนักวิจารณ์ LISP (รวมถึงคนที่เคยใช้ใน production แล้วเปลี่ยนไปภาษาอื่น) ชี้ปัญหาเพิ่มเติมที่ Graham ไม่พูดถึง: Dynamic typing ในระบบใหญ่ — refactoring ยาก, compiler จับ error ได้น้อย, debugging ใช้เวลานานใน codebase ระดับแสนบรรทัด Performance จนถึงยุค 2000s — ก่อน SBCL และ Chez Scheme, LISP runtime บน hardware ยุคนั้นช้ากว่า C/C++ มากโดยเฉพาะงาน numerical Fragmentation — Common Lisp กับ Scheme ไม่เคยตกลงกันได้; community แตกเป็นเสี่ยง ๆ แทนที่จะรวมพลัง สรุป: ไม่มีสาเหตุเดียว — มันคือ perfect storm ของ syntax ต่าง + เกิดผิดเวลา + community แตก + ไม่มี corporate sponsor (ต่างจาก Java ที่ Sun ทุ่ม, C# ที่ Microsoft ทุ่ม) มรดกที่มองไม่เห็น บทความนี้ไม่ได้ตั้งใจจะบอกว่า "คุณควรเขียน LISP" แต่ทุกครั้งที่คุณ: numbers = [1, 2, 3] squared = list(map(lambda x: x * x, numbers)) const result = data .filter(x => x.active) .map(x => x.value); let squared: Vec = numbers.iter().map(|x| x * x).collect(); — คุณกำลังเขียน LISP โดยไม่รู้ตัว อ่านเพิ่ม McCarthy's Original 1960 Paper — "Recursive Functions of Symbolic Expressions" Paul Graham — "Beating the Averages" Paul Graham — "Revenge of the Nerds" Structure and Interpretation of Computer Programs (SICP) — ตำรา Scheme ในตำนานของ MIT Rich Hickey — "Simple Made Easy" — ปรัชญาเบื้องหลัง Clojure 📅 สิงหาคม 2026 | ⚠️ ตรวจสอบข้อมูล ณ วันที่เขียน
This is a summary aggregated from Dev.to. Read the complete article on the original site:
Read full article at Dev.to