ฉันได้พยายามทำความเข้าใจความแตกต่างระหว่าง Lisp-1 และ Lisp-2 และสิ่งนี้เกี่ยวข้องกับ Clojure แต่ฉันยังไม่เข้าใจอย่างถูกต้อง มีใครตรัสรู้ได้ไหม
ฉันได้พยายามทำความเข้าใจความแตกต่างระหว่าง Lisp-1 และ Lisp-2 และสิ่งนี้เกี่ยวข้องกับ Clojure แต่ฉันยังไม่เข้าใจอย่างถูกต้อง มีใครตรัสรู้ได้ไหม
คำตอบ:
ตามวิกิพีเดีย :
การแยกเนมสเปซสำหรับฟังก์ชันเป็นข้อได้เปรียบหรือไม่นั้นเป็นที่มาของความขัดแย้งในชุมชน Lisp โดยปกติจะเรียกว่าการอภิปราย Lisp-1 vs. Lisp-2 Lisp-1 หมายถึงแบบจำลองของ Scheme และ Lisp-2 หมายถึงแบบจำลองของ Common Lisp
โดยพื้นฐานแล้วว่าตัวแปรและฟังก์ชันสามารถมีชื่อเดียวกันได้โดยไม่ต้องปะทะกัน Clojure เป็น Lisp-1ซึ่งหมายความว่าไม่อนุญาตให้ใช้ชื่อเดียวกันสำหรับฟังก์ชันและตัวแปรพร้อมกัน
list
มักใช้เป็นพารามิเตอร์ของฟังก์ชันและไม่มีสิ่งใดเลย OMG ที่สับสนมากเนื่องจาก(list ...)
เป็นฟังก์ชันมาตรฐาน ฟังก์ชันจำนวนมากที่มีlist
เป็นตัวแปรจะไม่ใช้list
ฟังก์ชันนี้หรืออย่าใช้ใกล้ตัวแปรนั้น แม้ว่าจะเกิดขึ้น แต่ก็ไม่เลวร้ายนัก: (list foo list)
. นี่ไม่น่าสับสนไปกว่าประโยคเช่น "fight the good fight" ที่มีคำเดียวกันปรากฏเป็นคำนามและคำกริยา
คุณอาจต้องการอ่านบทความนี้โดย Richard Gabriel มันเป็นบทสรุปของประเด็นที่ชุมชน Lisp กำลังคุยกันใน Lisp1 vs Lisp2 ค่อนข้างหนาแน่นและเคลื่อนไหวช้าในสองสามส่วนแรก แต่อ่านง่ายกว่ามากเมื่อคุณผ่านส่วนที่ 5
โดยทั่วไป Lisp1 มีสภาพแวดล้อมเดียวที่แมปสัญลักษณ์กับค่าและค่าเหล่านั้นอาจเป็น "ปกติ" หรือฟังก์ชันก็ได้ Lisp2 มี (อย่างน้อย) สองเนมสเปซ (สัญลักษณ์มีช่องสำหรับค่าฟังก์ชันและอีกหนึ่งช่องสำหรับค่าปกติ) ดังนั้นใน Lisp2 คุณสามารถมีฟังก์ชันชื่อ foo และค่าชื่อ foo ในขณะที่ใน Lisp1 ชื่อ foo สามารถอ้างถึงค่าเดียวเท่านั้น (ฟังก์ชันหรืออย่างอื่น)
มีการแลกเปลี่ยนและความแตกต่างของรสชาติระหว่างทั้งสอง แต่โปรดอ่านรายละเอียดในกระดาษ หนังสือของ Christian Queinnec เรื่อง "Lisp in Small Pieces" ยังมีการอภิปรายถึงความแตกต่างที่ถักทอผ่านข้อความ
funcall
และfunction
ตัวดำเนินการให้เต็ม สิ่งเหล่านี้หายไปในเสียงกระเพื่อม -1