2010-10-04 27 views
12

Có bất kỳ sự khác biệt nào giữa những gì trong Common Lisp bạn gọi là một nguyên tử, và một biểu tượng?Sự khác biệt giữa nguyên tử và biểu tượng trong Lisp thường là gì?

Những khác biệt này có mở rộng sang các ngôn ngữ khác trong gia đình Lisp không?

(Tôi biết rằng nguyên tử có một ý nghĩa khác nhau trong Clojure, nhưng tôi quan tâm đến ranh giới của một biểu tượng là gì.)

+0

Cái tên "nguyên tử" xuất phát từ tiếng Hy Lạp "atomos" có nghĩa là "không thể phân chia". Vì vậy, các phân tử được cho là bao gồm các hạt không phân chia được sinh ra từ "các nguyên tử" và bất kỳ thứ gì không phải là 'khuyết điểm 'trong Lisp thường không thể tách rời được. – erjiang

Trả lời

11

Trong Common Lisp, nguyên tử được định nghĩa một cách chính xác như bất kỳ đối tượng đó không phải là khuyết điểm. Xem http://l1sp.org/cl/atom để biết thêm chi tiết.

Tôi không biết về các ngôn ngữ khác trong gia đình Lisp.

1

Trong Scheme, một nguyên tử là bất cứ điều gì đó không phải là một cặp:

> (pair? 1) 
#f 
> (pair? '(1 2 3)) 
#t 
> (pair? 'a) 
#f 

Do đó những biểu tượng là các nguyên tử, cũng giống như con số và chuỗi. nguyên tử có định nghĩa tương tự trong Common Lisp, trong đó hàm (atom object) được định nghĩa là (not (consp object)).

+0

Đây chỉ là một trong những định nghĩa có thể có của một "nguyên tử" trong Đề án. –

0

Trong Lisp chung, biểu tượng rất giống với biến trong ngôn ngữ khác, mặc dù nặng hơn (không chỉ là một bộ nhớ trống đủ lớn để giữ giá trị). Nó thường là intern ed để nó có thể được tham chiếu theo tên, mặc dù nó có thể có các biểu tượng ẩn danh (giống như bộ nhớ trong C mà bạn có thể tham khảo chỉ bằng con trỏ).

Nguyên tử là một số giá trị không phải là ô cons. Biểu tượng là một nguyên tử, và đó là một số, một chuỗi và nhiều thứ khác. Việc sử dụng phổ biến nhất của cons ô là tạo danh sách, mặc dù có thể sử dụng chúng theo các cách khác.

+1

một biểu tượng không giống như một biến trong các ngôn ngữ khác. một biểu tượng là một 'đối tượng' với một cái tên. Trong mã nguồn chúng ta viết các biến với các ký hiệu, nhưng điều đó không làm cho một biểu tượng nhất thiết phải là một biến. (defun foo (bar) bar) <- đây BAR là một biểu tượng trong mã nguồn, nhưng ký hiệu không phải là biến trong hàm FOO được biên dịch. –

+0

@Rainer: Thật không may, tôi không biết cách nào tốt để mô tả một biểu tượng CL theo cách dễ hiểu ngay lập tức. Nó không chỉ là một đối tượng có tên. Nó thậm chí không cần phải có một cái tên (nghĩ '(gensym)'), và nó là một loại đối tượng khá lạ. –

+0

Chắc chắn nó có một tên: (ký hiệu-tên (gensym)) -> "G1620994". Nó chỉ là một cái tên được tính toán. Một biểu tượng là một đối tượng có tên, có thể được tra cứu theo tên nếu nó được chứa trong một gói và có thể được sử dụng để tham chiếu một giá trị, một hàm, gói của nó, tên của nó và danh sách thuộc tính. –

4

'nguyên tử' thường được xem trong quá trình xử lý danh sách. Trong một cái gì đó thường gặp Lisp là một danh sách không trống hoặc một nguyên tử. Trước đây, một nguyên tử cũng được gọi là 'biểu tượng nguyên tử', cái gì đó hơi khác một chút. Bây giờ trong nguyên tử Lisp thường không chỉ là biểu tượng, nhưng mọi thứ khác mà không phải là một ô khuyết điểm (ví dụ: chuỗi, số, hashtables, suối, ...).

Nếu một thứ không phải là nguyên tử (là khuyết điểm), có thể sử dụng CAR hoạt động, CDR, FIRST và REST.

Vì vậy, nguyên tử là một nhóm cấu trúc dữ liệu. Biểu tượng là một cấu trúc dữ liệu nhất định, cũng là một nguyên tử.

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