อะไรคือความแตกต่างระหว่าง Clojure, Scheme / Racket และ Common Lisp?


120

ฉันรู้ว่าพวกเขาเป็นภาษาถิ่นในตระกูลเดียวกันที่เรียกว่า lisp แต่อะไรคือความแตกต่างกันแน่? คุณช่วยให้ภาพรวมครอบคลุมหัวข้อต่างๆเช่นไวยากรณ์ลักษณะคุณลักษณะและแหล่งข้อมูลหากเป็นไปได้


3
ฉันขอภาพรวมทั่วไปของความแตกต่างเนื่องจากฉันคิดว่าคำถามนี้มีประโยชน์สำหรับคนอื่น ๆ อีกมากมายขออภัยหากฟังดูไม่เหมาะสม
MaiaVictor

4
ฉันมักจะสับสนว่าโพสต์ไหนควรไปที่ไหน นี่เป็นการอภิปรายเรื่องเครื่องมือจึงเป็นคำถามสำหรับที่นี่หรือโปรแกรมเมอร์? ตามหลักเหตุผลฉันจะบอกว่าให้ย้ายไปที่โปรแกรมเมอร์เพราะไม่ได้ขอให้แก้ปัญหาเฉพาะ แต่เป็นโพสต์ที่ดีพร้อมคำตอบที่ดี IMHO
octopusgrabbus

1
@octopusgrabbus: คำถามกว้างเกินไป การเปรียบเทียบภาษาโปรแกรมสามภาษาบน 'ไวยากรณ์ลักษณะคุณลักษณะและทรัพยากร' สามารถเติมเต็มหนังสือหรือเว็บไซต์ได้อย่างง่ายดาย Stackoverflow มีไว้สำหรับผู้ที่มีปัญหาในการเขียนโปรแกรมไม่ใช่สารานุกรม (Wikipedia) ไม่ใช่ฟอรัมสนทนาทั่วไป (Usenet) ไม่ใช่เว็บไซต์เปรียบเทียบภาษา ( rosettacode.org ) ดีที่สุดสำหรับปัญหาการเขียนโปรแกรมจริงที่คำถามมีรหัสและคำตอบมีรหัสด้วย บวก: อย่าสร้างปัญหาเพียงเพราะใครบางคนเบื่อหรือเป็นงานอดิเรก
Rainer Joswig

3
เพียงเพราะคำถามกว้างไม่ได้หมายความว่าคำถามนั้นไม่ได้อยู่ที่นี่ เป็นคำถามที่ชัดเจนมากและแน่นอนว่าเป็น "คำถามการเขียนโปรแกรมจริง" StackOverflow มีวัตถุประสงค์หลักเพื่อเป็นแหล่งข้อมูลชุมชน [googleable] สำหรับการแบ่งปันความรู้เกี่ยวกับการเขียนโปรแกรมผ่านรูปแบบ Q&A
Dan Burton

@RainerJoswig ฉันสามารถเขียนทุกสิ่งที่ฉันเรียนรู้เกี่ยวกับภาษาเหล่านั้นในวันที่ผ่านมาฉันได้เรียนภาษาเหล่านี้ แต่นั่นจะทำให้หัวข้อใหญ่ขึ้น นั่นเป็นเรื่องที่แย่มากเมื่อคุณรู้ว่าผู้คนจะใช้ประโยคสั้น ๆ แบบนั้นและจะไม่สามารถรับคำตอบได้เนื่องจากข้อความขนาดใหญ่ขัดขวางไม่ให้พวกเขาเข้าใจสิ่งที่ถูกถามอย่างรวดเร็ว การทำเช่นนี้จะช่วยให้มั่นใจได้ว่าจะมีคำตอบที่ดีให้กับผู้อื่น
MaiaVictor

คำตอบ:


103

พวกเขาทั้งหมดมีหลายสิ่งที่เหมือนกัน:

  • ภาษาแบบไดนามิก
  • พิมพ์อย่างแรง
  • รวบรวม
  • ไวยากรณ์สไตล์ Lisp กล่าวคือโค้ดถูกเขียนเป็นโครงสร้างข้อมูล Lisp (ฟอร์ม) โดยรูปแบบที่พบมากที่สุดคือการเรียกใช้ฟังก์ชันเช่น: (function-name arg1 arg2)
  • ระบบมาโครที่มีประสิทธิภาพที่ช่วยให้คุณสามารถจัดการโค้ดเป็นข้อมูลและสร้างรหัสที่กำหนดเองในขณะรันไทม์ (มักใช้เพื่อ "ขยายภาษา" ด้วยไวยากรณ์ใหม่หรือสร้าง DSL)
  • มักใช้ในรูปแบบการเขียนโปรแกรมเชิงฟังก์ชันแม้ว่าจะมีความสามารถในการรองรับกระบวนทัศน์อื่น ๆ
  • เน้นในการพัฒนาเชิงโต้ตอบด้วย REPL (เช่นคุณพัฒนาแบบโต้ตอบในอินสแตนซ์ที่ทำงานอยู่ของโค้ด)

คุณสมบัติที่โดดเด่นของ Lisp ทั่วไป:

คุณสมบัติที่โดดเด่นของ Clojure:

  • ระบบนิเวศของไลบรารีที่ใหญ่ที่สุดเนื่องจากคุณสามารถใช้ไลบรารี Java ได้โดยตรง
  • เวกเตอร์[]และแผนที่ที่{}ใช้เป็นมาตรฐานนอกเหนือจากรายการมาตรฐาน()นอกเหนือจากความสมบูรณ์ของเวกเตอร์และแผนที่บางคนเชื่อว่านี่เป็นนวัตกรรมที่ทำให้โดยทั่วไปอ่านได้ง่ายขึ้น
  • เน้นมากขึ้นเกี่ยวกับความไม่เปลี่ยนรูปและการเขียนโปรแกรมเชิงฟังก์ชันแบบเกียจคร้านซึ่งได้รับแรงบันดาลใจจาก Haskell
  • ความสามารถในการทำงานพร้อมกันที่แข็งแกร่งได้รับการสนับสนุนโดยหน่วยความจำธุรกรรมซอฟต์แวร์ในระดับภาษา (น่าติดตาม: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

คุณสมบัติที่โดดเด่นของโครงการ:

  • เป็นสิ่งที่ง่ายและง่ายที่สุดในการเรียนรู้ Lisp
  • มาโครที่ถูกสุขอนามัย (ดูhttp://en.wikipedia.org/wiki/Hygienic_macro ) - หลีกเลี่ยงปัญหาในการจับสัญลักษณ์โดยไม่ได้ตั้งใจในการขยายมาโคร

11
นี่เป็นสิ่งที่ดี แต่บางทีคุณควรพูดถึงว่าแร็กเก็ตเป็นมากกว่ารูปแบบ "แค่" เป็นระบบที่รองรับหลายภาษา (แต่เกี่ยวข้องกัน) (คุณสามารถกำหนดภาษาของคุณเองได้) นอกจากนี้ clojure ยังมีหลายวิธีในการเขียนโปรแกรมแบบ oo (ทั้งวิธีการจัดส่งหลาย ๆ แบบคลุมเครือคล้ายกับการปิดและบางอย่างที่ใกล้เคียงกับ java ที่มีประสิทธิภาพมากกว่าใน jvm) และโครงร่างกำลังก้าวไปสู่ไลบรารีมาตรฐานมากขึ้น (ซึ่งรวมถึง oo) ด้วย r6rs ซึ่งแร็กเกตรองรับ
andrew cooke

2
"ภาษาไดนามิกที่พิมพ์อย่างชัดเจน" คือการตลาด ในแง่นี้แม้แต่ Python ก็ถูกพิมพ์อย่างรุนแรง
ron

16
@ron: Python ถูกพิมพ์อย่างรุนแรงเช่นเดียวกับ Lisp (ไม่เหมือนกับการพูด Javascript หรือ VB) คุณกำลังคิดว่า "การพิมพ์แบบคงที่" เทียบกับ "การพิมพ์แบบไดนามิก" แทนโปรดดูen.wikipedia.org/wiki/Type_systemสำหรับความหลากหลายทั้งหมด แต่ใช่มันคือการตลาด
Nas Banov

2
ฉันคิดว่าแร็กเก็ตจะดีถ้าได้รับคำตอบนี้ ฉันคิดว่า Racket เรียนรู้ได้ง่ายกว่า Scheme เนื่องจากชุมชนและจุดเน้นของภาษา Racket (เดิมชื่อ PLT Scheme) เป็นภาษาการเขียนโปรแกรมแบบหลายกระบวนทัศน์สำหรับวัตถุประสงค์ทั่วไปในตระกูล Lisp / Scheme หนึ่งในเป้าหมายการออกแบบคือการใช้เป็นแพลตฟอร์มสำหรับการสร้างการออกแบบและการใช้งานภาษา
mtelesha

Clojure มีมาโครที่ถูกสุขอนามัย ข้อมูลเพิ่มเติมที่นี่: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff

50

คนข้างบนพลาดไปสองสามอย่าง

  1. Common Lisp มีเวกเตอร์และตารางแฮชด้วย ความแตกต่างคือ Common Lisp ใช้ # () สำหรับเวกเตอร์และไม่มีไวยากรณ์สำหรับตารางแฮช ฉันเชื่อว่าโครงการมีเวกเตอร์

  2. Common Lisp มีมาโครตัวอ่านซึ่งอนุญาตให้คุณใช้วงเล็บใหม่ (เช่นเดียวกับ Racket ซึ่งเป็นลูกหลานของ Scheme)

  3. Scheme และ Clojure มีมาโครที่ถูกสุขอนามัยซึ่งต่างจากที่ไม่ถูกสุขอนามัยของ Common Lisp

  4. ภาษาทั้งหมดเป็นภาษาที่ทันสมัยหรือมีโครงการปรับปรุงใหม่มากมาย Common Lisp มีห้องสมุดมากมายในช่วงห้าปีที่ผ่านมา (ขอบคุณ Quicklisp เป็นส่วนใหญ่) Scheme มีการใช้งานที่ทันสมัย ​​(Racket, Chicken, Chez Scheme ฯลฯ ) และ Clojure ถูกสร้างขึ้นเมื่อไม่นานมานี้

  5. Common Lisp มีระบบ OO ในตัวแม้ว่าจะค่อนข้างแตกต่างจากระบบ OO อื่น ๆ ที่คุณอาจเคยใช้ โดยเฉพาะอย่างยิ่งไม่มีการบังคับใช้ - คุณไม่จำเป็นต้องเขียนรหัส OO

  6. ภาษามีปรัชญาการออกแบบที่แตกต่างกันบ้าง โครงการได้รับการออกแบบให้เป็นภาษาถิ่นน้อยที่สุดสำหรับการทำความเข้าใจโมเดลนักแสดง ต่อมาถูกนำมาใช้เพื่อการเรียนการสอน Common Lisp ได้รับการออกแบบมาเพื่อรวมภาษาถิ่นของ Lisp มากมายที่ผุดขึ้นมา Clojure ออกแบบมาสำหรับการทำงานพร้อมกัน ด้วยเหตุนี้ Scheme จึงมีชื่อเสียงในด้านความเรียบง่ายและสง่างาม Common Lisp ของการมีพลังและกระบวนทัศน์ไม่เชื่อเรื่องพระเจ้า (functional, OO, อะไรก็ได้) และ Clojure ที่ชอบการเขียนโปรแกรมเชิงฟังก์ชัน


4
แร็กเก็ตไม่ใช่การนำ Scheme มาใช้ซึ่งเป็นการ จำกัด โหมดความเข้ากันได้ ดูstackoverflow.com/questions/3345397
ข้อบกพร่อง

Clojure ไม่ได้มีแมโครที่ถูกสุขอนามัยที่ผมได้พบวิธีที่ยาก
pyon

40

อย่าลืมเกี่ยวกับความแตกต่างของ Lisp-1 และ Lisp-2

Scheme และ Clojure คือ Lisp-1:
นั่นหมายความว่าทั้งตัวแปรและชื่อฟังก์ชันอยู่ในเนมสเปซเดียวกัน

Common Lisp คือ Lisp-2:
ฟังก์ชันและตัวแปรมีเนมสเปซที่แตกต่างกัน (ในความเป็นจริง CL มีหลายเนมสเปซ)


-4

Gimp เขียนใน Scheme :)

ในความเป็นจริงการจัดสรรซอฟต์แวร์บางคนคิดว่าอาจเขียนด้วย C ++ นั้นอาจทำภายใต้ร่ม Lisp มันยากที่จะเลือกแอปเปิ้ลสีทองออกจากพวง ความจริงก็คือ C ++ ไม่ได้รับความนิยมเสมอไปดูเหมือนว่าจะเป็นที่นิยมในปัจจุบันเนื่องจากมีประวัติการอัปเดต สำหรับครึ่งศตวรรษที่น้อยกว่า C ++ ไม่ได้ใช้งานมัลติเธรดด้วยซ้ำซึ่งทุกวันนี้ Python กลายเป็นเซสพูลของรหัสกาวบั๊กกี้ที่ไร้ประโยชน์ เร็วขึ้นเล็กน้อยและตอนนี้เรากำลังเห็นการเพิ่มขึ้นของการเขียนโปรแกรมเชิงฟังก์ชันมันเหมือนดัดแปลงหรือตายมากขึ้น ฉันคิดว่า Java มีสิทธิ์เท่าที่เกี่ยวข้องกับส่วนดัดแปลง

Scheme ได้รับการออกแบบมาเพื่อลดความซับซ้อนของภาษา Lisp นั่นเป็นเพียงจุดประสงค์เดียวยกเว้นว่าจะไม่เคยติดมาก่อน ฉันคิดว่า Clojure ทำสิ่งที่คล้ายกันเพื่อลดความซับซ้อนของ Scheme สำหรับ JVM ไม่มีอะไรมาก มันเหมือนกับภาษา JVM อื่น ๆ ที่มีเพื่อเพิ่มประสบการณ์ผู้ใช้เพียงเพื่อลดความซับซ้อนในการเขียนแบบสำเร็จรูปในดินแดน Java


2
"หมายถึงการลดความซับซ้อนของ Scheme สำหรับ JVM ไม่มีอะไรมาก" "เช่นเดียวกับภาษา JVM อื่น ๆ " ใช่แล้ว
oskarkv

4
Gimp เขียนด้วยภาษา C และรองรับ Scheme, Python และ Perl เป็นภาษาสคริปต์
lbalazscs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.