2010-06-03 40 views
33

tôi chưa bao giờ thực sự nghĩ về việc liệu một biểu tượng có thể là một số trong Lisp, vì vậy tôi đã chơi đùa với nó ngày hôm nay:Sự khác nhau giữa 1 và '1 trong Lisp là gì?

> '1 
1 
> (+ '1 '1) 
2 
> (+ '1 1) 
2 
> (define a '1) 
> (+ a 1) 
2 

Đoạn mã trên là chương trình, nhưng nó có vẻ là xấp xỉ như nhau trong Common Lisp và Clojure nữa. Có phải có bất kỳ sự khác biệt nào giữa 1 và được trích dẫn 1 không?

+3

Tôi đã đi vào khá nhiều chi tiết trả lời về cơ bản cùng một câu hỏi ở đây: http://stackoverflow.com/questions/2297452/using-quote-in-clojure - có lẽ câu trả lời đó có thể hữu ích cho bạn. –

Trả lời

10

Vâng, thực ra chúng là rất khác nhau. Tuy nhiên, '1 chính xác giống như (quote 1). (car ''x) đánh giá biểu tượng 'trích dẫn'.

1 là biểu thức S, biểu thị bên ngoài của biểu đồ, số 1. Để nói rằng 1 là 'đối tượng số' hoặc biểu thức S để nhập đối tượng đó cả hai đều có thể chấp nhận được. Thường thì người ta nói rằng 1 là biểu diễn bên ngoài cho đối tượng số thực.

(quote 1) là một S-biểu, nó là một S-biểu hiện cho một danh sách mà yếu tố đầu tiên là biểu tượng 'quote' và có yếu tố thứ hai là số 1. Đây là nơi đó là, từ khóa cú pháp đã khác nhau, không giống như các hàm, không được coi là các đối tượng trong ngôn ngữ và chúng không đánh giá chúng.

Tuy nhiên, cả hai là biểu diễn bên ngoài của các đối tượng (dữ liệu) mà đánh giá cho cùng một mốc. Con số có biểu diễn bên ngoài là 1, tuy nhiên chúng chắc chắn không phải là cùng một đối tượng, cùng một mã, cùng một mức dữ liệu giống nhau, chúng chỉ đánh giá cho cùng một thứ. Các con số tự đánh giá. Để nói rằng họ đều giống nhau là để nói rằng:

(+ 1 (* 3 3)) 

(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!") 

Are 'cùng', họ không, họ là cả hai chương trình khác nhau mà chỉ xảy ra với chấm dứt với cùng một giá trị, một hình thức lisp cũng là một chương trình, một biểu mẫu là một mốc cũng là một chương trình, hãy nhớ.

Ngoài ra, tôi được dạy một thủ thuật tiện dụng một lần cho thấy rằng dữ liệu tự đánh giá là thực sự không ký khi nhập:

(let ((num 4)) 
    (symbol? num) ; ====> evaluates to #f 
    (symbol? 'num) ; ====> evaluates to #t 
    (symbol? '4) ; ====> evaluates to #f 
    (symbol? '#\c) ; #f again, et cetera 
    (symbol? (car ''x)) ; #t 
    (symbol? quote) ; error, in most implementations 
) 

dữ liệu tự đánh giá thực sự đánh giá cho riêng mình, họ không 'biểu tượng được xác định trước' của một số loại.

11

Trích dẫn ngăn không cho các biểu thức được đánh giá cho đến sau này. Ví dụ: sau đây không phải là danh sách thích hợp:

(1 2 3) 

Điều này là do Lisp diễn giải 1 dưới dạng hàm, không phải. Vì vậy, danh sách phải được trích dẫn:

'(1 2 3) 

Khi bạn trích dẫn một biểu thức rất đơn giản như số, Lisp có hiệu quả không làm thay đổi hành vi của nó.

Xem Wikipedia: Lisp.

+2

Tại sao điều này có được upvotes? Điều này không trả lời được câu hỏi nào cả! Câu trả lời đúng là "những con số tự đánh giá bản thân", như dưới đây. – mquander

+1

Câu trả lời này có upvotes vì ​​nó giải thích lý do tại sao con số đánh giá cho chính họ và cung cấp một liên kết đến một bài viết Wikipedia với thông tin thêm. Nó thực sự trả lời câu hỏi. – mcandre

+1

Nhưng các mảng 7 chiều và các dạng lambda, ví dụ, là các đối tượng tự đánh giá trong khi ô đối lập không có, và tôi không chắc chắn tôi sẽ gọi các ví dụ trước đây là "đơn giản" hơn cái sau. Vì vậy, điều này chỉ hoạt động nếu bạn xác định "biểu thức rất đơn giản" là "đối tượng tự đánh giá". :-) – Ken

14

Số là self-evaluating objects. Đó là lý do tại sao bạn không phải lo lắng về việc trích dẫn chúng, như bạn làm với, nói, danh sách.

Biểu tượng có thể được tạo từ bất kỳ chuỗi nào. Nếu bạn muốn các biểu tượng có tên là nhân vật duy nhất 1, bạn có thể nói:

(intern "1") 

mà in |1|, cho thấy một cách khác để nhập nó:

'|1| 
+0

Tôi đang sử dụng clojure 1.1.0 ... ''| 1 |' đánh giá để ' | 1 | '. '| 1 |' đưa trở lại ... 'Không thể phân giải biểu tượng: | 1 |' – Droogans

25

Trong Common Lisp, '1 là viết tắt cho (QUOTE 1). Khi được đánh giá, (QUOTE một cái gì đó) trả về phần một cái gì đó, không được đánh giá. Tuy nhiên, không có sự khác biệt giữa 1 đánh giá và 1 không được đánh giá.

Vì vậy, có sự khác biệt đối với người đọc: '1 lần đọc là (QUOTE 1) và 1 lần đọc là 1. Nhưng không có sự khác biệt khi được đánh giá.

+2

Điều này áp dụng cho tất cả các biểu thức tự đánh giá – mathk

1

Trong Lisp, dấu nháy đơn ngăn các biểu tượng được đánh giá. Sử dụng dấu nháy đơn trước một số không bị cấm, không cần thiết vì các con số thể hiện bản thân. Tuy nhiên, giống như bất kỳ danh sách nào khác, nó tự động được chuyển thành một cuộc gọi hàm thích hợp. Người thông dịch coi những con số này trùng với giá trị của chúng.

+0

Gọi hàm? Chức năng nào? –

+0

Tôi muốn viết QUOTE (gọi hàm)! – Secko

+0

QUOTE không phải là một hàm. Trong Lisp, dấu nháy đơn ngăn cản việc đánh giá bất cứ thứ gì. Trong thời gian đọc nó được chuyển thành (quote ...). QUOTE là một dạng đặc biệt mà chỉ trả về đối số của nó không được đánh giá. Bộ đánh giá Lisp (trình thông dịch hoặc trình biên dịch) có một quy tắc đánh giá đặc biệt cho điều đó. –

1

Như đã được chỉ ra, không có sự khác biệt, vì số liệu tự đánh giá. Bạn có thể xác nhận điều này bằng cách sử dụng eval:

(eval 1) ;=> 1 

Điều này không giới hạn ở các con số. Trong thực tế, trong Common Lisp, hầu hết mọi thứ tự đánh giá bản thân. Nó chỉ là nó rất hiếm cho một cái gì đó khác hơn là số, dây, biểu tượng, và danh sách để được đánh giá. Ví dụ: các công trình sau:

(eval (make-hash-table)) ;equivalent to just (make-hash-table) 
1

Trong Lisp, quote ngăn không cho biểu thức sau đây được đánh giá. ' là viết tắt của quote. Kết quả là, '1 giống với (quote 1).

Tuy nhiên, trong Lisp, ký hiệu không bao giờ có thể là số. Ý tôi là, 'abc là một biểu tượng, nhưng '123 không phải là (được đánh giá thành) một biểu tượng. Tôi nghĩ rằng điều này là sai về thiết kế của Lisp. Một trường hợp khác không chỉ là #t hoặc #f có thể được sử dụng như một biểu thức Boolean.

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