Racket แตกต่างจาก Scheme อย่างไร


184

Racket เป็นลูกหลานของ Scheme แร็กเก็ตแตกต่างจาก R6RS อย่างไร มันเพิ่มอะไรหรือเอาไปหรือแตกต่างกันเพียง?

ฉันเข้าใจว่าไม้เป็นมากกว่าภาษามันเป็นแพลตฟอร์มสำหรับภาษา แต่ฉันหมายถึงภาษาหลักของแร็กเกต

คำตอบ:


132

ในที่สุดแร็กเก็ตขึ้นอยู่กับ R5RS ไม่ใช่ R6RS และไม่ใช่ superset ที่เข้มงวดของทั้งคู่ ฉันไม่คิดว่ามันสามารถเรียกได้ว่า 'โครงการ' เพราะมันไม่เข้ากันได้กับมาตรฐานใด ๆ ของโครงการ

การนำไปใช้งานส่วนใหญ่นั้นมีส่วนขยาย แต่แน่นอนว่าเข้ากันได้ไม่ได้แน่นอนคอมไพเลอร์ที่มาพร้อมกับ Racket สามารถทำงานในโหมด R5RS หรือ R6RS โครงการ R5 / 6RS ที่ถูกต้องที่ทำงานในโหมดแร็กเกตอาจถูกปฏิเสธทำให้เกิดข้อผิดพลาดรันไทม์หรือทำงานแตกต่างไปจากที่ควร ด้วยที่กล่าวว่าประเด็นหลักที่ไม่เข้ากันได้ย้อนหลังคือ:

  • แร็กเก็ตไม่มีset-cdr!และset-car!ค่อนข้างset-mcar!ใช้งานได้กับคู่ที่สร้างขึ้นโดยเฉพาะเป็นไม่แน่นอน
  • สิ่งที่เรียกไม้letrecที่เรียกว่าletrec*ใน R6RS และไม่อยู่ใน R5RS สิ่ง R5RS และ R6RS โทรletrecไม่อยู่ในแร็กเก็ต
  • ในไม้จำนวนมากของสิ่งที่ตนเองประเมินซึ่งจะยกข้อผิดพลาดใน R5RS, ที่สำคัญที่สุดคือรายการที่ว่างเปล่า
  • แร็กเก็ตเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก
  • แร็กเก็ตใช้งาน( ... )และ[ ... ]เทียบเท่า R5RS ไม่ได้ แต่ R6RS ทำ

อาจมีมากขึ้น แต่ในส่วนอื่น ๆ แร็กเกตเป็นชุดของโครงการ


24
ใน Racket ()ไม่ถูกต้องไม่ทำการประเมินตนเอง นอกจากนี้แร็กเก็ตยังมีข้อ จำกัด อีกมากletrecตัวอย่างเช่นแร็กเก็ตในr5rsภาษา เป็นตัวเลือกโดยเจตนาที่จะใช้letrec*เวอร์ชันเหมือนในภาษาเริ่มต้น
Eli Barzilay

9
@ Eli, อ๊ะคุณพูดถูกแร็กเกตทำงานในโหมด Swindle ดูเหมือนว่าจะพิจารณา()การประเมินตนเองฉันรู้สึกสับสนกับเรื่องนั้น ฉันไม่เคยเข้าใจเลยว่าทำไม()ไม่ประเมินตนเองใน Scheme เหมือนใน Common LISP
Zorf

@Zorf มันสามารถเปลี่ยนแปลงได้อย่างง่ายดายโดยการบรรทุกเกินพิกัด #%appแต่:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron

2
คำตอบนี้ควรได้รับการปรับปรุง คุณลักษณะของแร็กเก็ตอยู่เหนือกว่า Scheme ในตอนนี้พร้อมโมดูลและคำจำกัดความภาษาเป็นต้น
CinchBlue

1
@MaliRemorker ฉันไม่เข้าใจสิ่งที่คุณหมายถึงอย่างแน่นอน แต่โครงการอยู่ใน R7RS และ R6RS แต่แร็กเก็ตยังคงออกชุดคุณลักษณะ R6RS
CinchBlue

36

มันมีรายการไม่เปลี่ยนรูปดังกล่าวข้างต้น นอกจากนี้ยังมีระบบโครงสร้างที่ค่อนข้างสะอาดกว่าระบบบันทึก R6RS มันมีคลาสที่มุ่งเน้นวัตถุและระบบวัตถุ มันมีการสนับสนุนพื้นเมืองสำหรับการออกแบบโดยสัญญา มันมีระบบหน่วยเตือนความทรงจำของระบบโมดูล ML เช่นเดียวกับระบบโมดูลเช่นระบบโมดูล R6RS ฉันแน่ใจว่าฉันลืมหลายสิ่งตามที่ได้พูดไป

ฉันไม่แน่ใจว่าการเปลี่ยนชื่อนั้นมีประโยชน์เป็นอย่างอื่นนอกเหนือจากกลไกการตลาด แต่แร็กเก็ตเป็นภาษาที่แตกต่างกันอย่างแน่นอน


24
ฉันคิดว่าการเปลี่ยนชื่อเป็นเพราะพวกเขาไม่ต้องการเป็นภาษาถิ่นของ Scheme ที่มีส่วนเพิ่มเติมที่ไม่เป็นมาตรฐาน - พวกเขาต้องการเป็นภาษาที่ใช้ Scheme ซึ่งมีมาตรฐานมากกว่าสิ่งอื่น การจำแนก PLT Scheme เป็น "just" สำเนียงของ Scheme นั้นเหมือนกับการแบ่งประเภท Ruby เป็นสำเนียงของ Mirah - มันไม่ถูกต้อง แต่มันก็ลดความแข็งแกร่งของภาษาลง
Chuck

5
ฉันคิดว่าการใช้ชื่อที่แตกต่างเป็นการตัดสินใจที่ชาญฉลาด: การใช้ชื่อเดียวกันสำหรับภาษาต่าง ๆ ที่มีต้นกำเนิดร่วมกันคือการทำให้ IMO สับสน ฉันจะเปลี่ยนชื่อแม้ว่าภาษาที่มี Scheme เป็นส่วนย่อย แต่มีส่วนเพิ่มเติมมากมายที่จะสนับสนุนรูปแบบการเขียนโปรแกรมที่แตกต่างกันมาก
Giorgio


18

ข้อกำหนดภาษา R5RS สำหรับภาษาโปรแกรม Scheme นั้นขึ้นอยู่กับฉันทามติระหว่างผู้ดำเนินการ Scheme หลายราย นี่แปลว่าภาษามีเสถียรภาพมาก นอกจากนี้ยังแสดงว่าคุณสมบัติที่มีประโยชน์มากมายไม่ได้เป็นส่วนหนึ่งของมาตรฐาน R5RS

แร็กเก็ตได้สร้างขึ้นบน R5RS และขยายออกไปอย่างมาก ส่วนขยายบางอย่างถูกกำหนดเป็นมาโคร แต่คุณลักษณะบางอย่างต้องการการสนับสนุนระบบรันไทม์

คุณลักษณะใน Racket ไม่สามารถใช้งานได้โดยแมโครเพียงอย่างเดียว:

  • ตัวคั่นต่อเนื่อง (กว้างกว่าการโทร / cc)
  • เครื่องหมายต่อเนื่อง
  • หัวข้อ
  • สถานที่
  • FFI

โมดูลและระบบแมโครนั้นกว้างกว่าข้อกำหนด RnRS มาก เมื่อใช้ร่วมกับ#langข้อกำหนดของเครื่องอ่าน / ภาษาทำให้สามารถกำหนดภาษาที่กำหนดเอง (ด้วยไวยากรณ์ที่กำหนดเอง) และใช้กับโปรแกรมแร็กเกตปกติ

ในบางกรณีแร็กเก็ตมีโครงสร้างที่พฤติกรรมเบี่ยงเบนจาก R5RS สิ่งที่ชัดเจนที่สุดคือการconsสร้างคู่ที่ไม่เปลี่ยนรูป ( mconsสร้างคู่ที่ไม่แน่นอน) ข้อดีอย่างหนึ่งของการมีคู่ที่ไม่เปลี่ยนรูปคือlengthตอนนี้ทำงานในเวลา O (1) ตัดจำหน่าย


2
... แต่มันทำให้รายการ O (1) ผนวกเป็นไปไม่ได้
Will Ness

16

แร็กเก็ตมีจำนวนมากของโครงสร้างภาษาที่ดีจริงๆไม่รวมอยู่ในโครงการ R6RS เช่น"ตรง"


3
เหตุใด "การจับคู่" จึงเป็นคุณสมบัติที่ดี อย่างน้อยเมื่อคุณแสดงความคิดเห็นคุณควรให้คำอธิบายสั้น ๆ เพื่อให้คนที่ไม่คุ้นเคยกับแร็กเกตสามารถเข้าใจได้ว่าทำไม "การจับคู่" จึงเป็นประโยชน์ในทางทฤษฎี
nbro

1
การจับคู่รูปแบบเป็นคุณสมบัติที่ต้องการจริงๆในหลาย ๆ ภาษาที่มีพื้นหลังการเขียนโปรแกรมใช้งานได้ แต่น่าเสียดายที่ไม่ได้ R6RS หรือ Common LISP ใช้อุปกรณ์นี้ตามค่าเริ่มต้นดังนั้นใช่นี่เป็นคุณสมบัติที่ดีและแตกต่างกัน ตัวอย่างเช่นภาษาเช่น Haskell, Elixir, Rust และ F # ให้ประเภทของการก่อสร้างและมีการใช้งานอย่างหนัก ฉันทำโปรแกรม Lisp เป็นการส่วนใหญ่ใน Common LISP และฉันพลาดในหลายกรณีที่ไม่มีการนำรูปแบบการจับคู่มาใช้
Manoel Vilela

1
matchดีมาก แต่โชคดีที่มันเป็นเพียงแมโครดังนั้นจึงสามารถเพิ่มใน Lisps ที่ไม่มีได้อย่างง่ายดาย Common destructuring-bindเสียงกระเพื่อมสามารถทำจับคู่รูปแบบแสงในรายการผ่านทาง มันง่ายมากที่จะเขียนdestructuring-caseมาโครโดยใช้มันและหลาย ๆ คนมี สำหรับ Scheme จะมีmatchห้องสมุดแบบพกพา Clojure core.matchมี
Lassi

มาโครสามารถทำให้โค้ดอ่านยากเนื่องจากพวกเขามักจะมีความหมายพิเศษดังนั้นภาษาควรสร้างมาตรฐานสำหรับวัตถุประสงค์ทั่วไปทั้งหมดเพื่อให้ทุกคนไม่ได้สร้างมาโครของตัวเอง การจับคู่รูปแบบควรเป็นค่าเริ่มต้นเช่นเดียวกับใน Arc & Clojure & Racket & Ocaml & Haskell เนื่องจากเป็นการระบุเจตนาโดยตรง Caddr อยู่ในระดับต่ำเกินไป
aoeu256

12

สำหรับตัวอย่างใหญ่หนึ่งรายการ Racket จะไม่เปลี่ยนรูปโดยค่าเริ่มต้นในขณะที่ Scheme's นั้นไม่แน่นอน แร็กเก็ตยังมีไลบรารี่มาตรฐานจำนวนมาก (เช่นเว็บเซิร์ฟเวอร์) ที่โครงร่างอื่นไม่ทำ

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