Racket เป็นลูกหลานของ Scheme แร็กเก็ตแตกต่างจาก R6RS อย่างไร มันเพิ่มอะไรหรือเอาไปหรือแตกต่างกันเพียง?
ฉันเข้าใจว่าไม้เป็นมากกว่าภาษามันเป็นแพลตฟอร์มสำหรับภาษา แต่ฉันหมายถึงภาษาหลักของแร็กเกต
Racket เป็นลูกหลานของ Scheme แร็กเก็ตแตกต่างจาก R6RS อย่างไร มันเพิ่มอะไรหรือเอาไปหรือแตกต่างกันเพียง?
ฉันเข้าใจว่าไม้เป็นมากกว่าภาษามันเป็นแพลตฟอร์มสำหรับภาษา แต่ฉันหมายถึงภาษาหลักของแร็กเกต
คำตอบ:
ในที่สุดแร็กเก็ตขึ้นอยู่กับ R5RS ไม่ใช่ R6RS และไม่ใช่ superset ที่เข้มงวดของทั้งคู่ ฉันไม่คิดว่ามันสามารถเรียกได้ว่า 'โครงการ' เพราะมันไม่เข้ากันได้กับมาตรฐานใด ๆ ของโครงการ
การนำไปใช้งานส่วนใหญ่นั้นมีส่วนขยาย แต่แน่นอนว่าเข้ากันได้ไม่ได้แน่นอนคอมไพเลอร์ที่มาพร้อมกับ Racket สามารถทำงานในโหมด R5RS หรือ R6RS โครงการ R5 / 6RS ที่ถูกต้องที่ทำงานในโหมดแร็กเกตอาจถูกปฏิเสธทำให้เกิดข้อผิดพลาดรันไทม์หรือทำงานแตกต่างไปจากที่ควร ด้วยที่กล่าวว่าประเด็นหลักที่ไม่เข้ากันได้ย้อนหลังคือ:
set-cdr!
และset-car!
ค่อนข้างset-mcar!
ใช้งานได้กับคู่ที่สร้างขึ้นโดยเฉพาะเป็นไม่แน่นอนletrec
ที่เรียกว่าletrec*
ใน R6RS และไม่อยู่ใน R5RS สิ่ง R5RS และ R6RS โทรletrec
ไม่อยู่ในแร็กเก็ต( ... )
และ[ ... ]
เทียบเท่า R5RS ไม่ได้ แต่ R6RS ทำอาจมีมากขึ้น แต่ในส่วนอื่น ๆ แร็กเกตเป็นชุดของโครงการ
()
การประเมินตนเองฉันรู้สึกสับสนกับเรื่องนั้น ฉันไม่เคยเข้าใจเลยว่าทำไม()
ไม่ประเมินตนเองใน Scheme เหมือนใน Common LISP
#%app
แต่:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
มันมีรายการไม่เปลี่ยนรูปดังกล่าวข้างต้น นอกจากนี้ยังมีระบบโครงสร้างที่ค่อนข้างสะอาดกว่าระบบบันทึก R6RS มันมีคลาสที่มุ่งเน้นวัตถุและระบบวัตถุ มันมีการสนับสนุนพื้นเมืองสำหรับการออกแบบโดยสัญญา มันมีระบบหน่วยเตือนความทรงจำของระบบโมดูล ML เช่นเดียวกับระบบโมดูลเช่นระบบโมดูล R6RS ฉันแน่ใจว่าฉันลืมหลายสิ่งตามที่ได้พูดไป
ฉันไม่แน่ใจว่าการเปลี่ยนชื่อนั้นมีประโยชน์เป็นอย่างอื่นนอกเหนือจากกลไกการตลาด แต่แร็กเก็ตเป็นภาษาที่แตกต่างกันอย่างแน่นอน
ข้อกำหนดภาษา R5RS สำหรับภาษาโปรแกรม Scheme นั้นขึ้นอยู่กับฉันทามติระหว่างผู้ดำเนินการ Scheme หลายราย นี่แปลว่าภาษามีเสถียรภาพมาก นอกจากนี้ยังแสดงว่าคุณสมบัติที่มีประโยชน์มากมายไม่ได้เป็นส่วนหนึ่งของมาตรฐาน R5RS
แร็กเก็ตได้สร้างขึ้นบน R5RS และขยายออกไปอย่างมาก ส่วนขยายบางอย่างถูกกำหนดเป็นมาโคร แต่คุณลักษณะบางอย่างต้องการการสนับสนุนระบบรันไทม์
คุณลักษณะใน Racket ไม่สามารถใช้งานได้โดยแมโครเพียงอย่างเดียว:
โมดูลและระบบแมโครนั้นกว้างกว่าข้อกำหนด RnRS มาก เมื่อใช้ร่วมกับ#lang
ข้อกำหนดของเครื่องอ่าน / ภาษาทำให้สามารถกำหนดภาษาที่กำหนดเอง (ด้วยไวยากรณ์ที่กำหนดเอง) และใช้กับโปรแกรมแร็กเกตปกติ
ในบางกรณีแร็กเก็ตมีโครงสร้างที่พฤติกรรมเบี่ยงเบนจาก R5RS สิ่งที่ชัดเจนที่สุดคือการcons
สร้างคู่ที่ไม่เปลี่ยนรูป ( mcons
สร้างคู่ที่ไม่แน่นอน) ข้อดีอย่างหนึ่งของการมีคู่ที่ไม่เปลี่ยนรูปคือlength
ตอนนี้ทำงานในเวลา O (1) ตัดจำหน่าย
match
ดีมาก แต่โชคดีที่มันเป็นเพียงแมโครดังนั้นจึงสามารถเพิ่มใน Lisps ที่ไม่มีได้อย่างง่ายดาย Common destructuring-bind
เสียงกระเพื่อมสามารถทำจับคู่รูปแบบแสงในรายการผ่านทาง มันง่ายมากที่จะเขียนdestructuring-case
มาโครโดยใช้มันและหลาย ๆ คนมี สำหรับ Scheme จะมีmatch
ห้องสมุดแบบพกพา Clojure core.match
มี
สำหรับตัวอย่างใหญ่หนึ่งรายการ Racket จะไม่เปลี่ยนรูปโดยค่าเริ่มต้นในขณะที่ Scheme's นั้นไม่แน่นอน แร็กเก็ตยังมีไลบรารี่มาตรฐานจำนวนมาก (เช่นเว็บเซิร์ฟเวอร์) ที่โครงร่างอื่นไม่ทำ
()
ไม่ถูกต้องไม่ทำการประเมินตนเอง นอกจากนี้แร็กเก็ตยังมีข้อ จำกัด อีกมากletrec
ตัวอย่างเช่นแร็กเก็ตในr5rs
ภาษา เป็นตัวเลือกโดยเจตนาที่จะใช้letrec*
เวอร์ชันเหมือนในภาษาเริ่มต้น