อะไรคือความแตกต่างระหว่าง Lisp-1 และ Lisp-2?


96

ฉันได้พยายามทำความเข้าใจความแตกต่างระหว่าง Lisp-1 และ Lisp-2 และสิ่งนี้เกี่ยวข้องกับ Clojure แต่ฉันยังไม่เข้าใจอย่างถูกต้อง มีใครตรัสรู้ได้ไหม

คำตอบ:


69

ตามวิกิพีเดีย :

การแยกเนมสเปซสำหรับฟังก์ชันเป็นข้อได้เปรียบหรือไม่นั้นเป็นที่มาของความขัดแย้งในชุมชน Lisp โดยปกติจะเรียกว่าการอภิปราย Lisp-1 vs. Lisp-2 Lisp-1 หมายถึงแบบจำลองของ Scheme และ Lisp-2 หมายถึงแบบจำลองของ Common Lisp

โดยพื้นฐานแล้วว่าตัวแปรและฟังก์ชันสามารถมีชื่อเดียวกันได้โดยไม่ต้องปะทะกัน Clojure เป็น Lisp-1ซึ่งหมายความว่าไม่อนุญาตให้ใช้ชื่อเดียวกันสำหรับฟังก์ชันและตัวแปรพร้อมกัน


11
Lisp-2 ไม่สับสนอีกต่อไปที่มีฟังก์ชันและตัวแปรที่มีชื่อเดียวกันหรือไม่?
appshare.co

39
สาเหตุส่วนหนึ่งที่ทำให้โปรแกรมเมอร์ที่ใช้ภาษา Lisp-2 ไม่ออกนอกลู่นอกทางในการมีฟังก์ชันและตัวแปรที่มีชื่อเดียวกัน listมักใช้เป็นพารามิเตอร์ของฟังก์ชันและไม่มีสิ่งใดเลย OMG ที่สับสนมากเนื่องจาก(list ...)เป็นฟังก์ชันมาตรฐาน ฟังก์ชันจำนวนมากที่มีlistเป็นตัวแปรจะไม่ใช้listฟังก์ชันนี้หรืออย่าใช้ใกล้ตัวแปรนั้น แม้ว่าจะเกิดขึ้น แต่ก็ไม่เลวร้ายนัก: (list foo list). นี่ไม่น่าสับสนไปกว่าประโยคเช่น "fight the good fight" ที่มีคำเดียวกันปรากฏเป็นคำนามและคำกริยา
Kaz

5
@Zubair Java มีช่องว่างชื่อมากยิ่งขึ้น คุณสามารถกำหนดคลาสวิธีการและตัวแปรที่มีชื่อเดียวกัน
สิ้นสุด

20
ในฐานะผู้ช่วยจำฉันคิดว่า Lisp 1s มี 1 เนมสเปซและ Lisp 2s มี 2 เนมสเปซ (อันหนึ่งสำหรับฟังก์ชันและอีกอันสำหรับตัวแปร)
Nick McCurdy

4
@NickMcCurdy ในฐานะผู้ช่วยจำฉันคิดว่าจักรยานมีสองล้อและรถสามล้อมีสามล้อ
Kaz

74

คุณอาจต้องการอ่านบทความนี้โดย Richard Gabriel มันเป็นบทสรุปของประเด็นที่ชุมชน Lisp กำลังคุยกันใน Lisp1 vs Lisp2 ค่อนข้างหนาแน่นและเคลื่อนไหวช้าในสองสามส่วนแรก แต่อ่านง่ายกว่ามากเมื่อคุณผ่านส่วนที่ 5

โดยทั่วไป Lisp1 มีสภาพแวดล้อมเดียวที่แมปสัญลักษณ์กับค่าและค่าเหล่านั้นอาจเป็น "ปกติ" หรือฟังก์ชันก็ได้ Lisp2 มี (อย่างน้อย) สองเนมสเปซ (สัญลักษณ์มีช่องสำหรับค่าฟังก์ชันและอีกหนึ่งช่องสำหรับค่าปกติ) ดังนั้นใน Lisp2 คุณสามารถมีฟังก์ชันชื่อ foo และค่าชื่อ foo ในขณะที่ใน Lisp1 ชื่อ foo สามารถอ้างถึงค่าเดียวเท่านั้น (ฟังก์ชันหรืออย่างอื่น)

มีการแลกเปลี่ยนและความแตกต่างของรสชาติระหว่างทั้งสอง แต่โปรดอ่านรายละเอียดในกระดาษ หนังสือของ Christian Queinnec เรื่อง "Lisp in Small Pieces" ยังมีการอภิปรายถึงความแตกต่างที่ถักทอผ่านข้อความ


7
อีกหนึ่งส่วนที่น่าพิศวงของกระดาษกาเบรียลคือส่วนที่ 11 เกี่ยวกับการประมวลผลหลายขั้นตอน ในส่วนนั้นเขาบอกเป็นนัยว่า Lisp1 นั้นเอื้อต่อรูปแบบการเขียนโปรแกรมเชิงฟังก์ชันมากกว่าดังนั้นจึงเอื้อต่อการประมวลผลหลายขั้นตอนมากกว่า เห็นได้ชัดว่านี่เป็นที่สนใจของ Clojure แต่ฉันไม่แน่ใจจริงๆว่าทำไม Lisp1 จึงเอื้อต่อ FP มากกว่า ใครมีข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้
Peter McLain

41
อาจเป็นเพราะจุดสำคัญของ FP คือการถือว่าฟังก์ชันเป็นค่าระดับเฟิร์สคลาสดังนั้นจึงสะดวกและสะอาดกว่าในการปฏิบัติตามแนวคิดเช่นเดียวกับค่าอื่น ๆ ทั้งหมด
mikera

10
@PeterMcLain เมื่อผู้ใช้ภาษา Lisp-1 พูดว่า Lisp-1 เป็นสื่อกระแสไฟฟ้าในการเขียนโปรแกรมเชิงฟังก์ชันได้มากขึ้นสิ่งที่พวกเขาหมายถึงคือคุณไม่จำเป็นต้องยัดโค้ดfuncallและfunctionตัวดำเนินการให้เต็ม สิ่งเหล่านี้หายไปในเสียงกระเพื่อม -1
Kaz

3
ตัวอย่างสิ่งที่เกิดขึ้นเมื่อ Schemer พยายามเขียน Lisp: emacs.stackexchange.com/q/28979/2787
สิ้นสุด

2
คุณใช้วลี "อย่างน้อย" เกี่ยวกับ Lisp-2 ความแตกต่างง่ายๆระหว่าง 2 กรณีคือ: สัญลักษณ์อยู่ที่ตำแหน่งหัวของ s-expression หรือไม่ (ถ้าเป็นเช่นนั้นให้ค้นหาในเนมสเปซของฟังก์ชันอื่น ๆ ในเนมสเปซของตัวแปร) ช่วยยกตัวอย่างกรณีอื่นที่ไม่ใช่ 2 กรณีนี้ได้ไหม
Daniel Dinnyes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.