2010-09-08 39 views
13

Sau đây page nói về cách nguyên tử hoạt động trong Clojure. Nó không nói nhiều về sự khác biệt giữa các nguyên tử trong Clojure và các phương ngữ lisp khác.Sự khác biệt giữa nguyên tử trong Lisp thường và nguyên tử trong Clojure là gì?

Sự khác biệt chính giữa nguyên tử trong Lisp thường và nguyên tử trong Clojure là gì? (Điều gì bị thiếu trong định nghĩa nguyên tử trong Clojure tồn tại trong CL?)

Trả lời

19

Nguyên tử trong Clojure và nguyên tử trong Lisp chung (và hầu hết các Lisps khác) là hai khái niệm hoàn toàn không liên quan. Họ không có gì để làm với nhau, ngoài việc có cùng tên.

Không có 'khác biệt'. Nó sẽ được hỏi sự khác biệt giữa một cửa sổ trong một ngôi nhà và một cửa sổ trên màn hình máy tính của bạn là gì? Nó không có ý nghĩa để xác định sự khác biệt, vì hai khái niệm không liên quan.

'Nguyên tử' trong Clojure quản lý trạng thái.

'Nguyên tử' trong Lisp là một từ cho tất cả các loại dữ liệu không phải là ô khuyết điểm (như số, ký tự, chuỗi, ký hiệu, ...).

Trong Lisp chức năng ATOM chỉ đơn giản là định nghĩa là:

(defun atom (object) 
    (not (consp object))) 

Kể từ Clojure không có khuyết điểm tế bào và không có chức năng consp, nó không thể nói (not (consp object)). Do đó không tồn tại một khái niệm Lisp như 'nguyên tử' trong Clojure. Lưu ý rằng Clojure có hàm cons, nhưng nó không tạo ra các ô khuyết điểm như trong Lisp.

+6

Cần lưu ý rằng Clojure vẫn có nguyên tử Lisp trong các ký hiệu, từ khóa, số, chuỗi, v.v., nhưng nó không phải là một phần của từ vựng Clojure. –

+1

@ John Cromartie: điều đó thực sự không thể. Clojure không có tế bào khuyết điểm. Trong nguyên tử Lisp được định nghĩa là 'không khuyết điểm'. Kể từ khi clojure không có tế bào khuyết điểm, khái niệm về một nguyên tử Lisp là không xác định trong Clojure. Lưu ý rằng Clojure có một hoạt động khuyết điểm, nhưng nó không tạo ra các ô khuyết điểm. –

2

Họ là chủ yếu khác nhau và có một cơ sở khái niệm chung cho việc sử dụng tên 'Atom'

  • Atom trong lisp chung đề cập đến ý tưởng về một điều indivisable như ý nghĩa origional của một nguyên tử của vấn đề.

  • Atom trong clojure đề cập đến một cấu trúc dữ liệu có thể thay đổi cụ thể mà thay đổi 'nguyên tử' đó là một ghi vào nó, hoặc hoàn thành hoặc nó không (và sau đó được xem xét lại)

ý tưởng chung là khái niệm không thể phân chia được. trong CL của nó những gì là điều và trong Clojure của nó như thế nào điều thay đổi.

Trong nguyên tử Clojure được sử dụng khi bạn cần chặn dữ liệu có thể thay đổi không được điều phối. ví dụ một bộ đếm userId đơn lẻ hoặc một thứ gì đó. Clojure cũng đã phối hợp truy cập có thể thay đổi trong Refs (suy nghĩ chuyển khoản ngân hàng) và nguyên tử uncoordinated không chặn những điều có thể thay đổi trong Đại lý (nghĩ rằng thu gom đăng nhập ví dụ).

+0

Lisp thường không có ý tưởng về những thứ 'không thể phân chia'. Một khuyết điểm giống như một bản ghi hai khe - giống như một vectơ mục đích đặc biệt của hai mục. Khái niệm về một ATOM chỉ được định nghĩa để có nghĩa rằng nó là bất cứ điều gì khác hơn là một tế bào khuyết điểm. Nhưng ô khuyết điểm như là một cấu trúc dữ liệu không có gì đặc biệt (trái ngược với mảng, vectơ, dây, cấu trúc, đối tượng CLOS, ...), nó chỉ đặc biệt trong Lisp vì nó được sử dụng rộng rãi. –

0

Trong tất cả Lisps nguyên tửbiểu tượng rằng không danh sách (trừ danh sách trống). Chúng cũng được gọi là biểu thức S nguyên tử. Nguyên tử (không phân chia) là gì? Trong lịch sử các danh sách là một cái gì đó mà có thể được chia thành các phần nhỏ hơn, nơi các nguyên tử (nhưng không phải danh sách không có sản phẩm nào) chứa trong đó không thể.

Trong Clojure cũng có biểu thức S nguyên tử nhưng cũng có cấu trúc dữ liệu được gọi là Atom cho phép tạo đối tượng dữ liệu có thể thay đổi. Nguyên tử trong chúng là gì? Hoạt động .

Nếu bạn sửa đổi trạng thái của Atom thì có thể thay đổi thành công hay không. Sẽ không có một tình huống nào một nửa số đó (ví dụ như một số véc-tơ) sẽ thay đổi và một nửa sẽ không thay đổi. Nếu thao tác không thành công thì nó sẽ được thử lại và một luồng hiện tại sẽ đợi cho đến khi nó hoàn thành.

Sự khác biệt giữa nguyên tử của Lisp và Nguyên tử của Clojure là gì? Mức trừu tượng. Nguyên tử của Lisp là một loại biểu thức biểu tượng, trong khi các nguyên tử của Clojure là một lớp cấu trúc dữ liệu được sử dụng để xử lý dữ liệu được chia sẻ.

+1

Điều đó thật sai. Biểu tượng là một nguyên tử, nhưng nó không tự đánh giá. Trên thực tế ở Lisps cũ, rất nhiều thứ khác không tự đánh giá. Đánh giá cho họ là một lỗi. Là một nguyên tử và đánh giá là không liên quan. 'atom' chủ yếu có nghĩa là: mọi thứ không phải là một danh sách không trống. Mọi thứ không phải là một tế bào khuyết điểm là một nguyên tử. –

+0

Cảm ơn bạn đã sửa tôi. Tôi đã được cố định trên các từ khóa khi suy nghĩ về các nguyên tử. Đã xóa tuyên bố sai về tự đánh giá. – siefca

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