Câu hỏi Sự khác nhau giữa Lisp-1 và Lisp-2 là gì?


Tôi đã cố gắng để hiểu sự khác biệt giữa Lisp-1 và Lisp-2 và làm thế nào điều này liên quan đến Clojure nhưng tôi vẫn không hiểu đúng. Ai có thể khai sáng cho tôi không?


76
2018-01-02 13:30


gốc




Các câu trả lời:


Theo wikipedia:

Cho dù một không gian tên riêng biệt cho các chức năng là một lợi thế là một nguồn ganh đua 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 Đề án và Lisp-2 đề cập đến mô hình Common Lisp.

Về cơ bản, về việc liệu các biến và hàm có thể có cùng tên mà không bị xung đột hay không. Clojure là một Lisp-1 có nghĩa là nó không cho phép cùng một tên được sử dụng cho một hàm và một biến cùng một lúc.


50
2018-01-02 14:52



Không phải là một Lisp-2 khó hiểu hơn có chức năng và các biến có cùng tên không? - Zubair
Một phần lý do tại sao các lập trình viên sử dụng các phương ngữ Lisp-2 không đi theo cách của chúng để có các hàm và các biến có cùng tên. list thường được sử dụng như một tham số chức năng và không có thứ gì, OMG quá khó hiểu (list ...) là một hàm chuẩn. Nhiều chức năng có list dưới dạng biến không sử dụng list hoặc không sử dụng nó gần biến đó. Ngay cả khi điều đó xảy ra, nó cũng không quá tệ: (list foo list). Đây không phải là bất kỳ khó hiểu hơn một câu như "chống lại cuộc chiến tốt", nơi cùng một từ xuất hiện như một danh từ và động từ. - Kaz
@ Zubair Java có nhiều không gian tên hơn. Bạn có thể định nghĩa một lớp, một phương thức và một biến có cùng tên. - ceving
Như một sự ghi nhớ, tôi nghĩ về Lisp 1s là có 1 không gian tên, và Lisp 2 có 2 không gian tên (một cho các hàm và một cho các biến). - Nick McCurdy


Bạn có thể muốn đọc giấy bởi Richard Gabriel. Nó là một bản tóm tắt các vấn đề mà cộng đồng Lisp đã thảo luận trong Lisp1 vs Lisp2. Đó là một chút dày đặc và chậm di chuyển trong vài phần đầu tiên, nhưng dễ dàng hơn nhiều để đọc bởi thời gian bạn nhận được 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 cho các giá trị và các giá trị đó có thể là "thường xuyên" 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 giá trị cho một giá trị thông thường). Vì vậy, trong Lisp2, bạn có thể có một hàm có tên là foo và một giá trị có tên foo, trong khi trong Lisp1, tên foo chỉ có thể tham chiếu tới 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à sự khác biệt về hương vị giữa hai ngườ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 đã thảo luận về những khác biệt được dệt thông qua văn bản.


59
2018-01-02 17:43



Một trong những phần bí ẩn hơn của giấy Gabriel, là phần 11 về xử lý đa nhân. Trong phần đó, ông ngụ ý rằng Lisp1 có lợi hơn cho một phong cách chức năng của lập trình, do đó thuận lợi hơn để đa xử lý. Rõ ràng, đây là mối quan tâm của Clojure. Nhưng tôi không chắc lắm tại sao Lisp1 có lợi hơn cho FP. Bất cứ ai có cái nhìn sâu sắc về điều này? - Peter McLain
có lẽ vì điểm chính của FP là xử lý các hàm như là các giá trị lớp đầu tiên, do đó nó thuận tiện hơn và sạch hơn về mặt khái niệm để xử lý chúng giống như tất cả các giá trị khác - mikera
@PeterMcLain Khi người dùng các phương ngữ Lisp-1 nói rằng Lisp-1 có tính dẫn điện hơn với lập trình hàm, ý nghĩa của chúng là bạn không cần phải nhồi đầy mã funcall và function toán tử. Những biến mất trong một Lisp-1. - Kaz
Một ví dụ những gì xảy ra khi một Schemer cố gắng viết Lisp: emacs.stackexchange.com/q/28979/2787 - ceving
bạn đã sử dụng cụm từ "ít nhất" về Lisp-2. Sự phân biệt đơn giản giữa 2 trường hợp là: biểu tượng có ở vị trí đầu của biểu thức s hay không (nếu có, sau đó tra cứu trong không gian tên hàm, khác trong không gian tên biến). Bạn có thể đưa ra một số ví dụ khác, so với 2 trường hợp đó không? - Daniel Dinnyes