Vợt khác với Scheme như thế nào?


183

Vợt là hậu duệ của Scheme. Vợt khác với R6RS như thế nào? Những gì nó đã thêm, hoặc lấy đi, hoặc chỉ là khác nhau?

Tôi hiểu rằng vợt không chỉ là một ngôn ngữ, nó là một nền tảng cho các ngôn ngữ. Nhưng tôi đang nói đến phương ngữ vợt chính.

Câu trả lời:


131

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à:

  • Vợt không có set-cdr!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.
  • Những gì các cuộc gọi vợt letrecđược gọi letrec*trong R6RS và không tồn tại trong R5RS, những gì R5RS và R6RS gọi letreckhông tồn tại trong vợt.
  • 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 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ý ( ... )[ ... ]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.


23
Trong vợt ()không hợp lệ, không tự đánh giá. Ngoài ra, vợt không có sự hạn chế hơn letrec- ví dụ, một trong các r5rsngôn ngữ; đó là một lựa chọn có chủ ý để sử dụng letrec*phiên bản giống như trong ngôn ngữ mặc định.
Eli Barzilay

8
@ Eli, rất tiếc, bạn nói đúng, vợt chạy ở chế độ Lừa đảo dường như xem xét việc ()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.
Zorf

@Zorf Nó có thể dễ dàng được thay đổi bằng cách quá tải #%app, mặc dù:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron

1
Câu trả lời này nên được cập nhật. Tính năng của vợt được thiết lập vượt xa Scheme bây giờ, với các mô-đun và định nghĩa ngôn ngữ, v.v.
CinchBlue

@VermillionAzure Ý bạn là, giống như bộ tính năng của bất kỳ triển khai thực tế nào của Đề án vượt trội hơn Đề án tiêu chuẩn?
Remorker Mali

36

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ơ đồ.


23
Tôi nghĩ việc đổi tên là vì họ không muốn trở thành một phương ngữ của Scheme với một loạt các bổ sung không chuẩn - họ muốn trở thành một ngôn ngữ dựa trên Scheme với tiêu chuẩn nhiều thứ hơn. Phân loại Đề án PLT là "chỉ" một phương ngữ của Đề án giống như phân loại Ruby là một phương ngữ của Mirah - nó không chính xác, nhưng nó làm giảm sức mạnh của ngôn ngữ.
Chuck

5
Tôi nghĩ rằng sử dụng một tên khác là một quyết định khôn ngoan: sử dụng cùng tên cho các ngôn ngữ khác nhau có nguồn gốc chung là IMO gây nhầm lẫn. Tôi sẽ thay đổi tên ngay cả khi ngôn ngữ chứa Scheme như một tập hợp con nhưng chứa nhiều bổ sung đến mức nó sẽ khuyến khích một phong cách lập trình rất khác.
Giorgio


17

Đặ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:

  • tiếp tục được phân cách (tổng quát hơn cuộc gọi / cc)
  • dấu tiếp tục
  • chủ đề
  • nơi
  • ffi

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 consmột cặp bất biến ( mconsxâ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à lengthbây giờ chạy trong thời gian khấu hao O (1).


2
... nhưng nó làm cho danh sách O (1) nối thêm không thể.
Will Ness

16

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" .


2
Tại sao "khớp" là một tính năng tốt đẹp? Ít nhất, khi bạn bày tỏ ý kiến, bạn nên đưa ra lời giải thích ngắn gọn về nó, để mọi người không quen thuộc với Vợt có thể hiểu tại sao "khớp" về mặt lý thuyết lại có lợi.
nbro

1
Kết hợp mẫu là một tính năng thực sự mong muốn trên nhiều ngôn ngữ có nền tảng lập trình chức năng, thật không may, ngay cả R6RS hoặc Common Lisp cũng thực hiện điều này theo mặc định, vì vậy, đây là một tính năng thực sự hay và khác biệt mà vợt cung cấp. Ví dụ, các ngôn ngữ như Haskell, Elixir, Rust và F # cung cấp loại công trình đó và được sử dụng nhiều. Cá nhân tôi thực hiện lập trình Lisp chủ yếu trong Common Lisp và trong nhiều trường hợp tôi thiếu việc thực hiện khớp mẫu.
Manoel Vilela

matchlà 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-casemacro dựa trên nó, và nhiều người có. Đối với Đề án có matchthư viện di động . Clojure có core.match.
Lassi

Các macro có thể làm cho mã khó đọc vì chúng thường có ngữ nghĩa đặc biệt, do đó ngôn ngữ phải luôn chuẩn hóa tất cả các macro mục đích chung để mọi người không xây dựng các macro của riêng mình. Khớp mẫu phải là mặc định giống như trong Arc & Clojure & Rairs & Ocaml & Haskell vì nó chỉ định trực tiếp hơn ý định. Caddr là cấp độ quá thấp.
aoeu256

11

Đối với một ví dụ lớn, các danh sách vợt là bất biến theo mặc định trong khi Scheme là có thể thay đổi. Vợt cũng bao gồm rất nhiều thư viện tiêu chuẩn (ví dụ: Máy chủ Web) mà các Đề án khác không có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.