2011-01-13 39 views

Trả lời

10

Không có sự khác biệt lớn về cú pháp (chủ yếu là vì ngôn ngữ gia đình của Lisp có cú pháp gần như không), nhưng chắc chắn có sự khác biệt ở các khu vực khác. Clojure có rất nhiều tính năng lập trình hiện đại, đặc biệt phù hợp với khả năng mở rộng cao (diễn viên, tài liệu tham khảo, v.v.) không có trong Lisp "cổ điển" (như Common Lisp).

Clojure là một phương ngữ hoạt động, được hỗ trợ tốt của Lisp. Nếu bạn muốn tìm hiểu một Lisp, bạn có thể không thực sự đi sai với Clojure.

Bạn có thể tìm thêm thông tin trong câu trả lời cho Which Lisp should I learn?.

+5

Điều đó sai. Lisp có rất nhiều cú pháp. Tấn. Kiểm tra làm ví dụ cú pháp của DEFCLASS, DEFSTRUCT, LOOP và các cú pháp khác trong CL. Bên dưới là cú pháp cho biểu thức s - cũng không nhỏ. –

+4

Điểm nhỏ vì mục đích rõ ràng, Rainer. Anh ta nói "gia đình Lisp". Tất cả các ví dụ bạn đã sử dụng là Common Lisp và tôi cho rằng ví dụ hợp lệ duy nhất bạn đưa ra là LOOP, chỉ có các dạng kết hợp cú pháp (từ khóa) ngoài danh sách. Mặc dù vậy, đối chiếu tất cả các ví dụ của bạn chống lại Đề án, nơi gần như mọi thứ đều là DEFINE và không có cấu trúc nào mà bạn đề cập tồn tại. – Shaun

+0

@Shaun: Đề án đã xây dựng các từ khóa cú pháp và macro. Xem báo cáo Đề án. Nó bắt đầu với LET, LAMBDA, IF, ... Đừng nhầm lẫn giữa biểu thức là cú pháp Lisp. Cú pháp Lisp nằm trên đầu trang của s-expresssions. Lisp nói chung có một hình thức đơn giản cho các cuộc gọi chức năng. Nhưng mỗi Lisp có một số dạng cú pháp đặc biệt VÀ một số loại macro. MỌI macro đã có trong ngôn ngữ thực hiện SYNTAX. Cú pháp là cấu trúc của một ngôn ngữ. Các macro do người dùng định nghĩa là một cách trong mọi Lisp để có cú pháp mở rộng của người dùng. Ý tưởng 'không cú pháp' chỉ là một huyền thoại thường xuyên lặp lại. Mặt trái là sự thật. –

2

Tôi giả định bởi Lisp có nghĩa là Common Lisp, vì 'Lisp' chính nó là một gia đình ngôn ngữ (bao gồm Clojure) hơn là một ngôn ngữ cụ thể. Có một số thay đổi cú pháp trong đó Clojure được dự định là một Lisp hiện đại hơn. Ví dụ, bạn có thể tạo các vectơ với [] s, ánh xạ với {} s, không phải là một phần của Common Lisp. Và tất nhiên, Java interop chắc chắn sẽ trở thành một phần quan trọng của Clojure.

+5

[] và {} được dành riêng cho tiện ích mở rộng người dùng trong CL. Các vectơ được viết dưới dạng # (...). Cú pháp ký tự ở cấp độ đó có thể được cung cấp bởi các thư viện - và thực sự là. Có lẽ CL là Lisp hiện đại hơn, bởi vì cú pháp người dùng có thể mở rộng và sử dụng [] và {} có thể được sử dụng bởi các thư viện? –

+0

Lisp thường được gọi là chỉ Lisp. Tương tự như vậy, Lisp thường có nghĩa là Common Lisp. Gia đình Lisp thường được biểu thị là lisp, hoặc lisps. – Marko

3

Tôi nghĩ đó là công bằng khi nói rằng nếu bạn tìm hiểu các nguyên tắc của LISP bạn cũng sẽ biết nguyên tắc của Clojure và ngược lại. Tất cả chúng đều bắt nguồn từ cùng một triết lý, nhấn mạnh những thứ như:

  • Mã là dữ liệu. Macro là các hàm bình thường thao tác mã.

  • Sử dụng S-expressions để trình bày dữ liệu và mã.

  • Khái niệm về danh sách/chuỗi là cấu trúc cơ bản.

  • Lập trình hàm với chức năng hạng nhất.

Ngoài ra, có rất nhiều khác biệt về cú pháp, thư viện, môi trường thời gian chạy, v.v ... nếu bạn biết rõ hơn, thì cốt lõi các khái niệm sẽ quen thuộc nhưng vẫn còn rất nhiều khác biệt cơ bản.

Xem này list of ways that Clojure is different from other Lisps

+0

Có sự khác biệt "nhỏ" giữa các hàm và macro. Chức năng là lớp đầu tiên. Macros thì không. – boucekv

6

90% những gì bạn học khi đang học Lisp đầu tiên của bạn sẽ chuyển sang tiếp theo của bạn.

1

vectơ sử dụng Clojure như các tham số lambda (arguments giá trị), nhưng bạn có thể viết một macro defunlambda với sẽ trông như thế này trong Common Lisp. Clojure cũng có quyền truy cập vào các phương thức Java Object và đệ trình bằng cách sử dụng coma và tên trông giống như hàm bình thường gọi

(.toString 10) - sẽ gọi phương thức toString trên số 10 nhưng .toString không phải là một hàm. nếu bạn cố gắng kiểm tra giá trị của. toString nó ném exeption rằng. toString không được xác định biểu tượng.

Và cũng trong bán báo giá (chủ yếu là trong macro) thay vì sử dụng dấu phẩy của Clojure tylda.

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