2011-01-12 33 views
8

meta Clojure chỉ được duy trì nếu một chức năng xử lý và các chức năng chính của Clojure không bảo toàn meta. Quy tắc chung của ngón tay cái tôi đã nghe là các chức năng thu thập như conj, assoc, v.v. được cho là bảo tồn các hàm meta nhưng chuỗi như bản đồ, bộ lọc, lấy, v.v. không bảo toàn meta.Chức năng nào trong lõi bảo vệ lõi của Clojure?

Có danh sách nào đó về chức năng DO bảo tồn meta không?

Trả lời

5

Đó là tất cả về các loại. Các hàm chuỗi hoạt động giống như chúng gọi seq trên đối số của chúng và do đó không phải lúc nào cũng trả về cùng một loại đối tượng. Các hàm thu thập và các hàm kiểu cụ thể không gọi hàm seq và trả về một đối tượng có cùng kiểu như những gì đã được cung cấp cho chúng. Nó làm cho chúng trở nên ảo tưởng về việc trả lại cùng một đối tượng (điều này có thể là lý do cho hành vi này) ngay cả khi đó không phải là trường hợp. Chúng ta có thể nói rằng quy tắc của ngón tay cái là một chức năng bảo toàn meta khi nó bảo toàn loại.

user> (meta (seq (with-meta (list 1) {:a 1}))) 
{:a 1} 
user> (meta (seq (with-meta (vector 1) {:a 1}))) 
nil 

Hãy chắc chắn phải nhận thức được khi sự lười biếng có liên quan đến khó khăn:

user> (type (list 1)) 
clojure.lang.PersistentList 
user> (type (map identity (list 1))) 
clojure.lang.LazySeq 
user> (meta (seq (with-meta (map identity (list 1)) {:a 1}))) 
nil 

Đối với một danh sách các chức năng mà giữ gìn meta trên bộ sưu tập, hãy xem trang data structures. Những cái không được giữ lại dưới trang sequences, ngoại trừ khi chúng trả về một đối tượng cùng loại.

Dưới mui xe Tôi không hoàn toàn chắc chắn về các chi tiết kể từ sự lười biếng và chunked chuỗi đã được thêm vào, nhưng bạn có thể nhìn vào cons, seqseqFrom phương pháp từ lớp RT. Các chức năng không bảo quản siêu dữ liệu đi qua các phương pháp này. Trong khi các hàm sưu tập kết thúc bằng cách sử dụng các phương thức cụ thể cho các loại của chúng.

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