2011-12-18 24 views
14

Arc được xây dựng trên đầu trang của Racket. Vì cả hai đều ở trong gia đình Lisp, tôi tò mò về lợi thế của Arc over Racket, hoặc động lực tạo Arc là gì khi Racket có sẵn?Lợi thế của Arc over Racket

+7

Python được xây dựng "trên đầu trang của" C, vậy lợi thế của Python trên C là gì? Ngôn ngữ cơ bản, trừ khi nó được tiếp xúc, có ít liên quan đến sức mạnh của "cấp cao nhất". – drysdam

+11

Tôi nghi ngờ có bất kỳ - chương trình là một ngôn ngữ khá phổ biến với các thư viện để làm việc, trong khi arc là một dự án vanity từ một người đã tạo ra một cửa hàng web sớm. – Marcin

+1

Có vẻ như ngớ ngẩn khi so sánh DSL với một ngôn ngữ hoàn toàn riêng biệt. Ví dụ: tôi sẽ không nói "LiftWeb * hoặc * Scala" hoặc "Seaside * hoặc * SmallTalk" hoặc "Sinatra * hoặc * Ruby". (Các biểu mẫu Lisp được cấp có thể thực sự làm mờ sự khác biệt.) –

Trả lời

21

Viết ngôn ngữ của riêng bạn, theo nghĩa nào đó, trao quyền cho: bạn có thể chọn những nguyên thủy, loại biểu thức nào, thuận tiện để viết bằng ngôn ngữ đó. Theo nghĩa đó, bạn có thể xem một cuốn sách như On Lisp và thấy rằng các tác giả cốt lõi của Arc có ý kiến ​​mạnh mẽ về những thứ họ muốn từ một ngôn ngữ.

Nếu tôi đưa câu hỏi của bạn và đun sôi nó xuống các yếu tố cần thiết, có vẻ như sau: tại sao mọi người nên viết các ngôn ngữ dành riêng cho miền?

(Đó là một câu hỏi riêng biệt để xem xét liệu các nhân vật Arc có nên tái triển khai rất nhiều cơ sở nguyên thủy, chẳng hạn như hệ thống macro và mô-đun của riêng họ, khi có cơ chế như vậy được xây dựng trong Racket. quyền của tôi để tái phát minh.)

Tôi đoán một trong những phản đối mà tôi phải đối với Arc là: cách họ đã triển khai thời gian chạy chính thức khiến việc sử dụng lại công việc mà họ đã thực hiện trở lại Racket thuần túy trở nên khó khăn. Trong ý nghĩa đó, đó là nỗ lực giúp chỉ có một cộng đồng, trong khi nó sẽ được tốt đẹp để có thể dễ dàng hưởng lợi từ công việc của Arc folks.

16

Vợt là phương ngữ Đề án trong khi Arc thì không. Cả hai đều là phương ngữ LISP. Arc làm giảm số lượng dấu ngoặc đơn và có một số cú pháp được xây dựng ưa thích để làm cho nội dung phổ biến ngắn hơn trong kích thước mã. ví dụ:

;; scheme 
(if p1 c1 
    (if p2 c2 
     (if p3 c3 a3))) 

;; arc simplifies if 
(if p1 c1 
    p2 c2 
    p3 c3 
     a3) 

;; scheme 
(f1(f2(f3 a b))) 

;; arc simplifies cascading calls 
(f1:f2:f3 a b) 

;; scheme 
(lambda (x) (+ x x)) 

;; arc simplified one argument anonymous functions 
[+ _ _ ] 

;; scheme array access 
(vector-ref v1 5) 

;; arc simplifies array access 
(v1 5) 

Bạn có thể chọn cái kia. Cá nhân tôi thích cú pháp Arc nhưng không thực tế là nó được thực hiện như một thông dịch viên. Tôi muốn họ đã thực hiện Arc như một ngôn ngữ mô-đun Racket kể từ đó bạn thực sự có thể phát triển trong drracket, gỡ lỗi và thực hiện. Điều đó thậm chí có thể cho phép tạo các thư viện Racket trong Arc hoặc ngược lại.

Nếu bạn muốn tạo mã tương thích, bạn nên nghiêm ngặt hơn và sử dụng R6RS/R5RS hơn là sử dụng ngôn ngữ mặc định hoặc vòng cung vợt từ đó bạn có thể có mã mà bạn có thể chạy trên không chỉ là vợt. Trong vợt bạn có thể chọn R5RS hoặc sử dụng #! R6RS làm dòng đầu tiên trong mã để ép buộc chuẩn. Trong cả hai trường hợp, kết quả sẽ có thể chạy dưới các triển khai/trình biên dịch khác.

+1

Tôi sẽ nói điều gì đó về cond cho trường hợp đầu tiên cho vợt. '(cond (p1 c1) (p2 c2) (p3 c3) (#t c4))' là một chút so sánh công bằng hơn. –