Racket là cuối cùng dựa trên R5RS, và không R6RS và không phải là một superset nghiêm ngặt của một trong hai. Tôi không nghĩ rằng nó có thể được gọi là 'Đề án' bởi vì nó không tương thích ngược với bất kỳ tiêu chuẩn Đề án nào.
Hầu hết các triển khai cung cấp các phần mở rộng, nhưng ngược lại, tương thích ngược, tất nhiên, trình biên dịch đi kèm với Racket cũng có thể chạy ở chế độ R5RS hoặc R6RS. Lược đồ R5/6RS hợp lệ chạy trong chế độ vợt có thể bị từ chối, gây ra lỗi thời gian chạy, hoặc hoạt động khác với nó. Với những gì đã nói, những điểm chính mà nó không phải là tương thích ngược là:
- vợt không có
set-cdr!
và set-car!
, thay set-mcar!
mà chỉ hoạt động trên cặp đặc biệt tạo ra như có thể thay đổi.
- Cuộc gọi Racket
letrec
được gọi là letrec*
trong R6RS và không tồn tại trong R5RS, những gì R5RS và R6RS gọi letrec
không tồn tại trong Racket.
- Trong vợt, rất nhiều thứ tự đánh giá sẽ gây ra lỗi trong R5RS,
quan trọng nhất là danh sách trống.
- Vợt có phân biệt chữ hoa chữ thường, mặc dù R6RS cũng phân biệt chữ hoa chữ thường
- Vợt xử lý
(...)
và [ ... ]
tương đương, R5RS không, nhưng R6RS.
Có thể có nhiều hơn, nhưng trên hầu hết các phần khác, vợt là bộ siêu âm của Đề án.
Trong vợt '()' không hợp lệ, không tự đánh giá. Ngoài ra, Racket * không * có hạn chế hơn 'letrec' - ví dụ, một trong ngôn ngữ' r5rs'; đó là một sự lựa chọn có chủ ý để sử dụng phiên bản 'letrec *' giống như ngôn ngữ mặc định. –
@ Eli, rất tiếc, bạn nói đúng, vợt chạy ở chế độ Swindle dường như xem xét '()' tự đánh giá, tôi đã nhầm lẫn với điều đó. Tôi không bao giờ thực sự hiểu tại sao '()' không tự đánh giá trong Đề án vì nó nằm trong Common Lisp. – Zorf
@Zorf Nó có thể dễ dàng thay đổi bằng cách quá tải '#% app', mặc dù:' #lang racket (yêu cầu (đổi tên trong vợt [#% app cũ])) (define-syntax #% app (syntax-rules() [(_) '()] [(_. phần còn lại) (cũ. phần còn lại)])) (null?()) ;; => # t' –