Sự khác biệt giữa Lisp-1 và Lisp-2 là gì?


94

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:


68

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.


11
Không phải là một Lisp-2 khó hiểu hơn khi có các hàm và biến có cùng tên?
appshare.co

39
Một phần lý do tại sao các lập trình viên sử dụng phương ngữ Lisp-2 không cố gắng để các hàm và biến có cùng tên. listthườ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ó listdưới dạng một biến không sử dụng listhà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ừ.
Kaz

5
@Zubair Java thậm chí còn 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.
thúc

19
Để dễ nhớ, tôi nghĩ Lisp 1 có 1 không gian tên và Lisp 2 có 2 không gian tên (một cho hàm và một cho biến).
Nick McCurdy

4
@NickMcCurdy Như một cách dễ nhớ, tôi nghĩ xe đạp có hai bánh và xe ba bánh có ba.
Kaz

71

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.


7
Một trong những phần bí ẩn hơn của bài báo Gabriel, là phần 11 về Đa xử lý. Trong phần đó, ông ngụ ý rằng Lisp1 có lợi hơn cho một kiểu lập trình theo chức năng, do đó có lợi hơn cho đa xử lý. Rõ ràng, điều này là quan tâm wrt Clojure. Nhưng tôi không thực sự chắc chắn tại sao Lisp1 lại 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

40
có lẽ vì điểm chính của FP là coi các hàm như các giá trị lớp đầu tiên, do đó sẽ thuận tiện hơn và sạch hơn về mặt khái niệm khi xử lý chúng theo cách giống như tất cả các giá trị khác
mikera

10
@PeterMcLain Khi người dùng phương ngữ Lisp-1 nói rằng Lisp-1 dẫn điện hơn đối với lập trình chức năng, ý của họ là bạn không cần phải nhồi đầy mã funcallfunctiontoán tử. Chúng biến mất trong Lisp-1.
Kaz

3
Một ví dụ điều gì sẽ xảy ra khi một Schemer cố gắng viết Lisp: emacs.stackexchange.com/q/28979/2787
ceving

2
bạn đã sử dụng cụm từ "ít nhất" về Lisp-2. Sự khác biệt đơn giản giữa 2 trường hợp là: liệu ký hiệu có ở vị trí đầu của một biểu thức s hay không (nếu có, hãy tra cứu trong không gian tên hàm, ngược lại trong không gian tên biến). Bạn có thể đưa ra một số ví dụ về trường hợp khác, ngoài 2 trường hợp đó?
Daniel Dinnyes
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.