2010-03-19 31 views
7

Cấu trúc Clojure có thể được mở rộng tùy ý, thêm các trường mới.Tôi có thể thêm các trường vào loại clojure không?

Có thể mở rộng các loại (được tạo bằng cách sử dụng deftype) theo cách tương tự không?

EDIT: Đối với khách truy cập trong tương lai lợi ích, như Brian đã chỉ ra bên dưới, tính năng này có thể thay đổi.

+0

deftype vẫn đang trong quá trình xử lý, mọi thứ có thể thay đổi. Xem ví dụ http://groups.google.com/group/clojure/browse_frm/thread/a8b4a1a00fe8d0f2/2ff645127490228b –

+0

Cảm ơn, chủ đề đó sẽ hữu ích. –

Trả lời

7

Thực ra bạn có thể coi các loại là bản đồ, bạn chỉ cần mở rộng clojure.lang.IPersistentMap (một triển khai được cung cấp một cách kỳ diệu).

(deftype A [a b] 
    clojure.lang.IPersistentMap) 
(A 1 2) ;; => #:A{:a 1, :b 2} 
(assoc (A 1 2) :c 3) ;; => #:A{:a 1, :b 2, :c 3} 

Note

Clojure có kể từ khi chia ngữ nghĩa của các loại thành defrecorddeftype. Đối với hầu hết các chương trình cấp ứng dụng, bạn sẽ muốn sử dụng các bản ghi. Thuận tiện, họ sẽ tự động cung cấp một thực hiện clojure.lang.IPersistentMap, không cần phép thuật.

+1

Tôi thích những thứ được cung cấp một cách kỳ diệu. Cảm ơn câu trả lời. –

+0

Điều này không hoạt động trong Clojure 1.2, bạn sẽ chỉ nhận được một java.lang.AbstractMethodError, như bạn mong đợi mà không cung cấp bất kỳ triển khai nào. –

+0

Điều này có giá trị đối với bản phát hành phiên bản beta đầu tiên của Clojure 1.2. Tôi đã thêm ghi chú để đề cập đến những thay đổi trong bản phát hành cuối cùng. –

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