2010-10-09 40 views
28

Từ đọc các tài liệu giới thiệu về Lisp, bây giờ tôi xem xét sau đây để được giống hệt nhau:Trong Lisp (Clojure, Emacs Lisp), sự khác biệt giữa danh sách và báo giá là gì?

(list 1 2 3) 

'(1 2 3) 

Tuy nhiên, xét vấn đề tôi gặp phải khi sử dụng các hình thức niêm yết ở cả hai Clojure và Emacs Lisp, họ không sự tương tự. Bạn có thể cho tôi biết sự khác biệt là gì không?

+0

Chúng bị bỏ tương tự trên thực tế, hãy xem câu hỏi của tôi [here] (http://stackoverflow.com/questions/32927115/lisp-quote-work-internally?noredirect = 1 # comment53680808_32927115) – William

Trả lời

9

Danh sách được trích dẫn (ví dụ: '(1 2 3)) cần được xử lý cẩn thận (thường là chỉ đọc). (xem các câu trả lời SO When to use 'quote in LispWhen to use 'quote in Lisp).

(list 1 2 3) sẽ "chống" danh sách mới, độc lập với tất cả những người khác.

Bạn có thể xem ví dụ về một lỗ hổng khi sử dụng danh sách được trích dẫn trong manual for nconc.

Và, như bạn có thể biết, khi bạn gọi 'list - các đối số rõ ràng sẽ được đánh giá so với nội dung của danh sách được trích dẫn. Và 'quote lấy một đối số duy nhất, so với số đối số biến số 'list s.

(list (+ 1 2) 3)  --> (3 3) 
(quote ((+ 1 2) 3)) --> ((+ 1 2) 3) 
+1

Tôi thích rằng bạn đã chỉ ra sự khác biệt giữa "chữ ký" của họ, số lượng đối số. –

8

Trong Lisp thông thường, các đối tượng được trích dẫn là dữ liệu theo nghĩa đen. Bạn không nên sửa đổi dữ liệu này, vì hậu quả là không xác định. hậu quả có thể là: sửa đổi các dữ liệu chia sẻ, cố gắng sửa đổi dữ liệu chỉ đọc, một lỗi có thể được báo hiệu, nó chỉ có thể làm việc, ...

Đối với danh sách:

'(1 2 3) 

Trên đây là một danh sách liên tục , sẽ được người đọc xây dựng và tự đánh giá, bởi vì nó được trích dẫn. Nếu nó xuất hiện trong mã Lisp, trình biên dịch sẽ nhúng dữ liệu này bằng cách nào đó trong mã FASL.

(quote (1 2 3)) là một cách khác để viết.

(list 1 2 3) 

này là lời kêu gọi của hàm Common Lisp LIST với ba đối số 1, 23. Khi đánh giá kết quả là một danh sách mới tươi (1 2 3).

tương tự:

'(1 . 2) and (cons 1 2) 

'#(1 2 3) and (vector 1 2 3) 

Một là các dữ liệu theo nghĩa đen và người kia là một cuộc gọi chức năng xây dựng một cấu trúc dữ liệu đó.

34

Sự khác biệt chính là quote ngăn chặn việc đánh giá các yếu tố, trong khi list không:

 
user=> '(1 2 (+ 1 2)) 
(1 2 (+ 1 2)) 
user=> (list 1 2 (+ 1 2)) 
(1 2 3) 

Vì lý do này (trong số những người khác), nó là clojure thành ngữ sử dụng một vector khi mô tả một bộ sưu tập đen :

 
user=> [1 2 (+ 1 2)] 
[1 2 3] 
+0

câu trả lời này có vẻ không trung thực vì nó không đề cập đến '(danh sách 1 2 '(+ 1 2))' vẫn là một danh sách nhưng phần tử thứ ba không được đánh giá nhưng nó không thể hiện sự khác biệt giữa '' (1 2 (+ 1 2)) 'và' (danh sách '1' 2 '(+ 1 2)) ' – Dmitry

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