Sự khác biệt giữa Clojure, Scheme / Racket và Common Lisp là gì?


120

Tôi biết chúng là phương ngữ của cùng một họ ngôn ngữ được gọi là ngọng, nhưng sự khác biệt chính xác là gì? Bạn có thể đưa ra một cái nhìn tổng quan, nếu có thể, bao gồm các chủ đề như cú pháp, đặc điểm, tính năng và tài nguyên.


3
Tôi yêu cầu một cái nhìn tổng quan hơn về sự khác biệt bởi vì tôi cho rằng câu hỏi này có thể hữu ích cho nhiều người khác, xin lỗi nếu nó nghe có vẻ lạm dụng.
MaiaVictor

4
Tôi luôn bối rối không biết bài viết nào nên đi đâu. Đây là một cuộc thảo luận về các công cụ, vì vậy nó là một câu hỏi cho ở đây hoặc các lập trình viên? Về mặt logic, tôi muốn nói rằng hãy chuyển nó cho các lập trình viên, bởi vì nó không yêu cầu giải quyết một vấn đề cụ thể, nhưng đó là một bài đăng tốt với câu trả lời tốt IMHO.
octopusgrabbus

1
@octopusgrabbus: câu hỏi quá rộng. So sánh ba ngôn ngữ lập trình về 'cú pháp, đặc điểm, tính năng và tài nguyên' có thể dễ dàng điền vào một cuốn sách hoặc một trang web. Stackoverflow dành cho những người gặp vấn đề về lập trình, nó không phải là bách khoa toàn thư (Wikipedia), không phải là diễn đàn thảo luận chung (Usenet), không phải là trang so sánh ngôn ngữ ( rosettacode.org ). Tốt nhất cho vấn đề lập trình thực mà câu hỏi có mã và câu trả lời cũng có mã. Thêm vào đó: Đừng tạo ra vấn đề chỉ vì ai đó đang buồn chán hoặc đó là sở thích.
Rainer Joswig

3
Chỉ vì câu hỏi rộng không có nghĩa là nó không thuộc về đây. Đó là một câu hỏi hoàn toàn rõ ràng , và nó chắc chắn là một "câu hỏi lập trình thực sự". StackOverflow chủ yếu có ý nghĩa là một tài nguyên cộng đồng [có thể google] để chia sẻ kiến ​​thức về lập trình thông qua định dạng Hỏi & Đáp.
Dan Burton

@RainerJoswig, tôi có thể viết tất cả những gì tôi học được về những ngôn ngữ đó trong những ngày qua tôi đã nghiên cứu chúng, nhưng điều đó sẽ làm cho chủ đề lớn. Điều đó thực sự tồi tệ khi bạn nhận ra rằng mọi người sẽ tìm kiếm loại câu ngắn gọn đó và sẽ không thể nhận được câu trả lời vì một văn bản lớn cản trở họ hiểu nhanh những gì đang được hỏi. Làm theo cách này đảm bảo sẽ có thêm nhiều người được giúp đỡ bởi một câu trả lời hay.
MaiaVictor

Câu trả lời:


103

Tất cả chúng đều có nhiều điểm chung:

  • Ngôn ngữ động
  • Đã gõ mạnh
  • Tổng hợp
  • Cú pháp kiểu Lisp, tức là mã được viết dưới dạng cấu trúc dữ liệu Lisp (dạng) với mẫu phổ biến nhất là các lệnh gọi hàm như: (function-name arg1 arg2)
  • Hệ thống macro mạnh mẽ cho phép bạn coi mã là dữ liệu và tạo mã tùy ý trong thời gian chạy (thường được sử dụng để "mở rộng ngôn ngữ" với cú pháp mới hoặc tạo DSL)
  • Thường được sử dụng trong phong cách lập trình chức năng, mặc dù có khả năng phù hợp với các mô hình khác
  • Nhấn mạnh vào phát triển tương tác với REPL (tức là bạn phát triển tương tác trong một phiên bản mã đang chạy)

Các tính năng khác biệt của Lisp chung:

Tính năng đặc biệt của vải clojure:

  • Hệ sinh thái thư viện lớn nhất, vì bạn có thể sử dụng trực tiếp bất kỳ thư viện Java nào
  • Vectơ []và bản đồ {}được sử dụng làm chuẩn ngoài danh sách chuẩn ()- ngoài tính hữu dụng chung của vectơ và bản đồ, một số người tin rằng đây là một sự đổi mới giúp dễ đọc hơn
  • Nhấn mạnh hơn vào tính bất biến và lập trình chức năng lười biếng, phần nào được lấy cảm hứng từ Haskell
  • Khả năng đồng thời mạnh mẽ được hỗ trợ bởi bộ nhớ giao dịch phần mềm ở cấp độ ngôn ngữ (đáng xem: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Lược đồ các tính năng đặc biệt:

  • Có thể cho rằng Lisp đơn giản nhất và dễ học nhất
  • Macro hợp vệ sinh (xem http://en.wikipedia.org/wiki/Hygienic_macro ) - tránh các vấn đề ngẫu nhiên khi chụp biểu tượng trong các mở rộng macro

11
điều này là tốt, nhưng có lẽ bạn nên đề cập rằng vợt không phải là sơ đồ "chỉ"; đó là một hệ thống hỗ trợ nhiều ngôn ngữ (nhưng có liên quan) (bạn thậm chí có thể xác định ngôn ngữ của riêng mình). Ngoài ra, clojure có nhiều cách khác nhau để thực hiện lập trình giống như oo (cả cách tiếp cận nhiều công văn tương tự như cách đóng và một cái gì đó gần với java hiệu quả hơn trên jvm). và lược đồ đang hướng tới nhiều thư viện tiêu chuẩn hơn (bao gồm cả oo) với r6rs, loại vợt hỗ trợ.
andrew Cooke

2
"Ngôn ngữ động được đánh máy mạnh" là tiếp thị. Theo nghĩa này, ngay cả Python cũng được gõ mạnh.
ron

16
@ron: Python được gõ mạnh, giống như Lisp (không giống như Javascript hay VB). Thay vào đó, bạn đang nghĩ "nhập tĩnh" so với "nhập động", hãy xem en.wikipedia.org/wiki/Type_system để biết tất cả các loại. Nhưng có, đó là tiếp thị
Nas Banov

2
Tôi cũng nghĩ rằng Racket sẽ rất tốt nếu được thêm vào câu trả lời này. Tôi nghĩ Racket thậm chí còn dễ học hơn Scheme do tính cộng đồng và trọng tâm của ngôn ngữ. Racket (tên trước đây là PLT Scheme) là một ngôn ngữ lập trình đa mô hình, có mục đích chung trong họ Lisp / Scheme. Một trong những mục tiêu thiết kế của nó là phục vụ như một nền tảng để tạo, thiết kế và triển khai ngôn ngữ.
mtelesha

Clojure có macro hợp vệ sinh. Thông tin thêm tại đây: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff

50

Những người ở trên đã bỏ lỡ một vài điều

  1. Lisp chung cũng có vectơ và bảng băm. Sự khác biệt là Common Lisp sử dụng # () cho vectơ và không có cú pháp cho bảng băm. Đề án có vectơ, tôi tin rằng

  2. Common Lisp có các macro trình đọc, cho phép bạn sử dụng các dấu ngoặc mới (cũng như Racket, một hậu duệ của Scheme).

  3. Scheme và Clojure có macro hợp vệ sinh, trái ngược với những macro không hợp vệ sinh của Common Lisp

  4. Tất cả các ngôn ngữ đều hiện đại hoặc có nhiều dự án cải tạo. Common Lisp đã có được nhiều thư viện rộng lớn trong 5 năm qua (chủ yếu nhờ Quicklisp), Scheme có một số triển khai hiện đại (Racket, Chicken, Chez Scheme, v.v.) và Clojure được tạo ra tương đối gần đây

  5. Common Lisp có một hệ thống OO tích hợp sẵn, mặc dù nó khá khác so với các hệ thống OO khác mà bạn có thể đã sử dụng. Đáng chú ý, nó không được thực thi - bạn không phải viết mã OO.

  6. Các ngôn ngữ có triết lý thiết kế hơi khác nhau. Đề án được thiết kế như một phương ngữ tối thiểu để hiểu Mô hình diễn viên; nó sau đó được sử dụng cho sư phạm. Common Lisp được thiết kế để thống nhất vô số phương ngữ Lisp đã xuất hiện. Clojure được thiết kế cho đồng thời. Kết quả là, Scheme có tiếng là tối giản và thanh lịch, Common Lisp là mạnh mẽ và mô hình bất khả tri (chức năng, OO, bất cứ điều gì), và Clojure thiên về lập trình chức năng.


4
Racket không phải là một triển khai của Đề án, cấm các chế độ tương thích. Xem stackoverflow.com/questions/3345397
lỗi

Clojure không có macro hợp vệ sinh, vì tôi đã tìm thấy một cách khó khăn.
pyon

40

Đừng quên về sự khác biệt của Lisp-1 và Lisp-2.

Scheme và Clojure là Lisp-1:
Có nghĩa là cả tên biến và tên hàm đều nằm trong cùng một không gian tên.

Lisp chung là Lisp-2:
Hàm và các biến có không gian tên khác nhau (thực tế CL có nhiều không gian tên).


-4

Gimp được viết bằng Scheme :)

Trên thực tế, việc phân bổ phần mềm mà một số người nghĩ rằng có thể được viết bằng C ++ có lẽ đã được thực hiện dưới sự bảo trợ của Lisp, thật khó để chọn ra những quả táo vàng ra khỏi chùm. Thực tế là C ++ không phải lúc nào cũng phổ biến, ngày nay nó chỉ có vẻ phổ biến do có lịch sử cập nhật. Trong nửa thế kỷ chưa đầy, C ++ thậm chí còn không sử dụng đa luồng, đó là nơi mà Python ngày nay là một đống mã keo lỗi vô dụng chưa được kiểm tra. Đơn giản hơn một chút và bây giờ chúng ta đang chứng kiến ​​sự gia tăng trong lập trình chức năng, giống như thích nghi hoặc chết đi. Tôi nghĩ Java có nó đúng khi có liên quan đến phần thích ứng.

Đề án được thiết kế để đơn giản hóa ngôn ngữ Lisp, đó là mục đích duy nhất của nó ngoại trừ nó không bao giờ thực sự bắt kịp. Tôi nghĩ rằng Clojure làm một cái gì đó tương tự như nó có nghĩa là để đơn giản hóa Đề án cho JVM. Nó cũng giống như mọi ngôn ngữ JVM khác chỉ ở đó để nâng cao trải nghiệm người dùng, chỉ để đơn giản hóa việc ghi bảng soạn sẵn trong vùng đất Java.


2
"có nghĩa là để đơn giản hóa Lược đồ cho JVM không hơn không kém" "giống như mọi ngôn ngữ JVM khác" Yeah, right.
oskarkv

4
Gimp được viết bằng C và nó hỗ trợ Scheme, Python và Perl dưới dạng các ngôn ngữ kịch bản.
lbalazscs
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.