2011-01-02 35 views

Trả lời

46

Theo wikipedia:

Cho dù một namespace riêng cho các chức năng là một lợi thế là một nguồn tranh chấp 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.

Đó là cơ bản về việc liệu các biến và các hàm có thể có cùng tên mà không xung đột. Clojure is a 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.

+9

Lisp-2 có khó hiểu hơn khi có chức năng và biến có cùng tên không? – Zubair

+26

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ố hàm và không có thứ gì, OMG gây nhầm lẫn vì' (list ...) 'là một hàm chuẩn. Nhiều hàm có 'list' như một biến không sử dụng hàm' 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ệ: '(liệt kê danh sách foo)'. Đâ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

+2

@ 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

58

Bạn có thể đọc điều này paper 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 theo thời gian bạn nhận được phần qua 5.

Về cơ bản, Lisp1 có một môi trường duy nhất ánh xạ biểu tượng cho các giá trị, và các giá trị có thể được hoặc là "thường xuyên" hoặc chức năng. 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 yếu tố này, 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.

+7

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 thực sự chắc chắn * 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? –

+30

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

+9

@PeterMcLain Khi người dùng phương ngữ Lisp-1 nói rằng Lisp- 1 là dẫn điện hơn để lập trình hàm, ý nghĩa của chúng là bạn không cần phải nhồi nhét mã của các toán tử 'funcall' và' function'. Những biến mất trong một Lisp-1. – Kaz

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