2010-07-27 21 views
145

Vợt là một hậu duệ của Đề án. Làm thế nào là vợt khác với R6RS? Nó đã thêm gì, hoặc lấy đi, hoặc chỉ khác nhau?Làm thế nào là vợt khác nhau từ Đề án?

Tôi hiểu rằng Racket không chỉ là ngôn ngữ, mà còn là nền tảng cho ngôn ngữ. Nhưng tôi đang đề cập đến phương ngữ Racket chính.

Trả lời

107

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!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ý (...)[ ... ] 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.

+20

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

+8

@ 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

+0

@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' –

9

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

29

Danh sách này chứa 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 bản ghi R6RS. Nó có một lớp hướng đối tượng và hệ thống đối tượng. Nó có hỗ trợ bản địa cho thiết kế theo hợp đồng. Nó có một hệ thống đơn vị gợi nhớ của 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 rằng 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 hữu ích như bất cứ điều gì khác ngoài một 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 chương trình.

+17

Tôi nghĩ rằng việc đổi tên là vì họ không muốn là một số phương ngữ của Đề án 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 Đề án với nhiều tiêu chuẩn hơn. Phân loại lược đồ PLT là "chỉ" một phương ngữ của Đề án giống như phân loại Ruby như một phương ngữ của Mirah - nó không phải là không chính xác, nhưng nó làm giảm thế mạnh của ngôn ngữ. – Chuck

+4

Tôi nghĩ sử dụng tên khác là 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 khó hiểu. Tôi sẽ thay đổi tên ngay cả khi ngôn ngữ chứa Scheme như một tập con nhưng chứa rất nhiều bổ sung mà nó sẽ khuyến khích một phong cách lập trình rất khác nhau. – Giorgio

18

Lý do cho việc đổi tên từ sơ đồ PLT sang vợt được thảo luận on the Racket site.

12

Vợt bao gồm nhiều cấu trúc ngôn ngữ thực sự tốt đẹp không có trong lược đồ R6RS, như "match".

+0

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

+0

Pattern Matching là một tính năng thực sự mong muốn trên nhiều ngôn ngữ với nền lập trình chức năng, tiếc là thậm chí không R6RS hoặc Common Lisp thực hiện điều này theo mặc định, vì vậy có đây là một tính năng thực sự tốt đẹp và khác biệt mà Racket 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 xây dựng và được sử dụng nhiều. Cá nhân tôi làm cho lập trình Lisp chủ yếu trong Common Lisp và tôi bỏ lỡ trong nhiều trường hợp thiếu mẫu phù hợp với việc triển khai. –

11

Đặc tả ngôn ngữ R5RS trên ngôn ngữ lập trình Đề án 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ữ là 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 yêu cầu hỗ trợ của hệ thống thời gian chạy.

Nét đặc trưng trong vợt không thể thực hiện được bởi alone macro:

  • continuations phân định (tổng quát hơn gọi/cc)
  • tiếp tục đánh dấu
  • đề
  • nơi
  • ffi

Mô-đun và hệ thống macro tổng quát hơn so với đặc điểm kỹ thuật của RnRS. Cùng với #lang đặc điểm đọc/ngôn ngữ giúp bạn có thể 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 Racket bình thường.

Trong một vài trường hợp Racket có cấu trúc có hành vi sai lệch so với R5RS. Điều rõ ràng nhất là làm cho cons xây dựng một cặp không thay đổi (mcons tạo nên một cặp có thể thay đổi). Một lợi thế của việc có cặp không thay đổi, là length hiện đang chạy trong O (1) thời gian khấu hao.

+0

... nhưng nó làm cho O (1) liệt kê thêm không thể. –

Các vấn đề liên quan