Câu trả lời:
Vợt cuối cùng dựa trên R5RS, không phải 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ĩ nó có thể được gọi là 'Lược đồ' 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 đều cung cấp các tiện ích mở rộng, nhưng mặt khác tương thích ngược, tất nhiên, trình biên dịch đi kèm với Vợt 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 mức cần thiết. Như đã nói, những điểm chính không tương thích ngược là:
set-cdr!
và set-car!
, thay vào set-mcar!
đó chỉ hoạt động trên các cặp được tạo cụ thể là có thể thay đổi.letrec
được gọi 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 vợt.( ... )
và [ ... ]
tương đương, R5RS thì không, nhưng R6RS thì không.Có lẽ có nhiều hơn, nhưng trên hầu hết các bộ phận khác vợt là một superset của Scheme.
()
tự đánh giá, tôi đã nhầm lẫn với điều đó. Tôi chưa bao giờ thực sự hiểu tại sao ()
không tự đánh giá trong Đề án như trong Common Lisp.
#%app
, mặc dù:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Nó chứa các danh sách bất biến, như đã đề cập ở trên. Nó cũng chứa một hệ thống cấu trúc sạch hơn một chút so với hệ thống ghi R6RS. Nó có một lớp hướng đối tượng và hệ thống đối tượng. Nó có hỗ trợ riêng cho thiết kế theo hợp đồng. Nó có một hệ thống đơn vị gợi nhớ đến hệ thống mô-đun ML, cũng như một hệ thống mô-đun giống như hệ thống mô-đun R6RS. Tôi chắc chắn tôi đã quên nhiều thứ như tôi đã đề cập.
Tôi không chắc chắn rằng việc đổi tên là hữu ích như bất kỳ thứ gì khác ngoài mánh lới quảng cáo tiếp thị, nhưng vợt chắc chắn là một phương ngữ riêng biệt của sơ đồ.
Lý do cho việc thay đổi tên từ PLT Scheme sang Vợt được thảo luận trên trang web của Vợt .
Đặc tả ngôn ngữ R5RS trên ngôn ngữ lập trình Scheme dựa trên sự đồng thuận giữa nhiều người triển khai Đề án. Điều này ngụ ý rằng ngôn ngữ rất ổn định. Nó cũng ngụ ý rằng nhiều tính năng hữu ích không phải là một phần của tiêu chuẩn R5RS.
Vợt đã được xây dựng dựa trên R5RS và mở rộng nó rất nhiều. Một số tiện ích mở rộng được định nghĩa là macro, nhưng một số tính năng cần có sự hỗ trợ của hệ thống thời gian chạy.
Các tính năng trong Vợt không thể triển khai chỉ bằng macro:
Các mô-đun và hệ thống vĩ mô là tổng quát hơn nhiều so với đặc điểm kỹ thuật RnRS. Cùng với #lang
đặc tả ngôn ngữ / trình đọc cho phép xác định ngôn ngữ tùy chỉnh (với cú pháp tùy chỉnh) và sử dụng chúng với các chương trình Vợt thông thường.
Trong một vài trường hợp, vợt có các cấu trúc có hành vi lệch khỏi R5RS. Điều rõ ràng nhất là tạo ra cons
một cặp bất biến ( mcons
xây dựng một cặp có thể thay đổi). Một lợi thế của việc có các cặp bất biến, là length
bây giờ chạy trong thời gian khấu hao O (1).
Vợt bao gồm rất nhiều cấu trúc ngôn ngữ thực sự tốt đẹp không có trong sơ đồ R6RS, như "khớp" .
match
là rất tốt nhưng may mắn thay, nó chỉ là một macro để có thể dễ dàng thêm vào Lisps mà không có nó. Lisp thông thường có thể thực hiện khớp mẫu ánh sáng trên danh sách thông qua destructuring-bind
. Thật đơn giản để viết một destructuring-case
macro dựa trên nó, và nhiều người có. Đối với Đề án có match
thư viện di động . Clojure có core.match
.
()
không hợp lệ, không tự đánh giá. Ngoài ra, vợt không có sự hạn chế hơnletrec
- ví dụ, một trong cácr5rs
ngôn ngữ; đó là một lựa chọn có chủ ý để sử dụngletrec*
phiên bản giống như trong ngôn ngữ mặc định.