2015-04-15 33 views
7

Tôi đã gặp một vấn đề mà tôi không chắc liệu mình có được mọi thứ đúng cho đến nay trên Lisp hay không.Tạo danh sách chứa T là phần tử đơn

Về cơ bản, nhiệm vụ là tầm thường: Tạo danh sách chỉ chứa một mục duy nhất - số T theo nghĩa đen.

tiếp cận đầu tiên của tôi là:

'(t) 

là đúng này? Về cơ bản, nó đánh giá thành

(T) 

có vẻ đúng. Khi biểu tượng T tự đánh giá, điều này sẽ thực hiện công việc. Nhưng sau đó nó đã cho tôi suy nghĩ ... Nếu tôi viết

'(s) 

tôi nhận được:

(S) 

này trông khá giống nhau, nhưng nên đánh giá theo một cách khác. Vì vậy, tôi nghĩ về

(list t) 

đó cũng dẫn đến:

(T) 

Nếu tôi so sánh những biểu tượng sử dụng eq họ đều bình đẳng:

(eq (car (list t)) (car '(t))) 

Và cũng nếu II so sánh cả hai giá trị để T trực tiếp, mọi thứ đều tốt đẹp:

(eq (car (list t)) t) 
(eq (car '(t)) t) 

Vì vậy, để cắt một câu chuyện dài ngắn: '(t) hiện công việc, phải không?

Trả lời

8

Tôi không nghĩ bạn hiểu đầy đủ về đánh giá.

Hiện tại, chúng tôi xem mã Lisp. Điều đó có nghĩa là mã nguồn của một ngôn ngữ lập trình. Không s-biểu thức:

'(t) 

Trên đây là giống như:

(quote (t)) 

Nếu chúng tôi đánh giá nó, Lisp thấy các nhà điều hành đặc biệt QUOTE. QUOTE ngăn không cho đánh giá mẫu đính kèm và trả lại.

Do đó, kết quả là (T). T không bao giờ được đánh giá. (T) không bao giờ được đánh giá. (T) là một danh sách theo nghĩa đen.

Nếu bạn viết '(s) hoặc '(sin) hoặc bất kỳ biểu tượng nào khác, nó không quan trọng. Nó luôn luôn là một danh sách theo nghĩa đen của một biểu tượng.

Mã một lần nữa:

(list t) 

Đó là một ứng dụng chức năng.Khi được đánh giá:

  • Lisp sẽ xem danh sách có LIST làm chức năng.

  • nó đánh giá các đối số. T được tự đánh giá.

  • nó gọi LIST với đối số T.

  • chức năng LIST trả về danh sách mới: (T).

sự khác biệt giữa

(defun foo() 
    '(t)) 

(defun bar() 
    (list t)) 

là gì?

FOO trả về danh sách chữ thường, được nhúng trong mã.

BAR gọi LIST khi chạy và mỗi lần trả về danh sách mới.

Cả hai danh sách đều chứa cùng một biểu tượng: T.

Vì vậy, sự khác biệt sẽ giảm xuống dữ liệu không đổi so với dữ liệu được tạo bởi hàm.

+0

Giải thích tuyệt vời, cảm ơn :-). Tôi vẫn thường xuyên không nghĩ về những gì có nghĩa là trích dẫn… ngoài ra, gợi ý với dữ liệu liên tục so với dữ liệu được tạo ra bởi một hàm khá hữu ích. Cảm ơn! –

+0

Trích dẫn có nghĩa là chính xác điều được trả về bởi người đọc được sử dụng. – Svante

+2

@Svante: Thông thường không phải trong Common Lisp. Theo biên dịch tập tin có những trường hợp mà đây không phải là trường hợp cho các đối tượng theo nghĩa đen. Ví dụ bạn có mã nguồn sử dụng hai danh sách (1 2 3). Danh sách có thể là EQ hay không. Trong một trường hợp người đọc có thể đọc một cái gì đó, mà không kết thúc trong mã. Ngoài ra hãy tưởng tượng, người đọc chạy trong một Lisp nơi mã được biên dịch và một Lisp khác mà mã được biên dịch được nạp. –

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