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 | ⚠️ ตรวจสอบข้อมูล ณ วันที่เขียน

What is going on?








