Tôi đã cố gắng hiểu sự khác biệt giữa Lisp-1 và Lisp-2 và điều này liên quan như thế nào đến Clojure nhưng tôi vẫn chưa hiểu đúng. Có ai có thể khai sáng cho tôi không?
Tôi đã cố gắng hiểu sự khác biệt giữa Lisp-1 và Lisp-2 và điều này liên quan như thế nào đến Clojure nhưng tôi vẫn chưa hiểu đúng. Có ai có thể khai sáng cho tôi không?
Câu trả lời:
Theo wikipedia :
Liệu một không gian tên riêng cho các chức năng có phải là một lợi thế hay không là một nguồn tranh cãi trong cộng đồng Lisp. Nó thường được gọi là cuộc tranh luận Lisp-1 và Lisp-2. Lisp-1 đề cập đến mô hình của Scheme và Lisp-2 đề cập đến mô hình của Common Lisp.
Về cơ bản, nó là về việc liệu các biến và hàm có thể có cùng tên mà không đụng độ nhau hay không. Clojure là một Lisp-1 có nghĩa là nó không cho phép sử dụng cùng một tên cho một hàm và một biến đồng thời.
list
thường được sử dụng như một tham số hàm và không ai khác, OMG rất khó hiểu vì (list ...)
nó là một hàm tiêu chuẩn. Nhiều hàm có list
dưới dạng một biến không sử dụng list
hàm hoặc không sử dụng nó gần biến đó. Ngay cả khi điều đó không xảy ra nó không quá xấu: (list foo list)
. Điều này không khó hiểu hơn một câu như "chiến đấu với cuộc chiến tốt" trong đó cùng một từ xuất hiện như một danh từ và động từ.
Bạn có thể muốn đọc bài báo này của Richard Gabriel. Đây là một bản tóm tắt các vấn đề mà cộng đồng Lisp đã thảo luận trong Lisp1 và Lisp2. Nó hơi dày đặc và diễn biến chậm trong một vài phần đầu tiên, nhưng sẽ dễ đọc hơn nhiều khi bạn vượt qua phần 5.
Về cơ bản, Lisp1 có một môi trường duy nhất ánh xạ các ký hiệu với các giá trị và các giá trị đó có thể là "thông thường" hoặc các hàm. Lisp2 có (ít nhất) hai không gian tên (các ký hiệu có một vị trí cho giá trị hàm của chúng và một cho giá trị thông thường). Vì vậy, trong Lisp2, bạn có thể có một hàm có tên foo và một giá trị có tên là foo, trong khi trong Lisp1, tên foo chỉ có thể tham chiếu đến một giá trị duy nhất (hàm hoặc cách khác).
Có một số sự cân bằng và khác biệt về khẩu vị giữa hai loại, nhưng hãy đọc bài báo để biết chi tiết. Cuốn sách của Christian Queinnec, "Lisp in Small Pieces" cũng có cuộc thảo luận về những khác biệt được dệt nên qua văn bản.
funcall
và function
toán tử. Chúng biến mất trong Lisp-1.