2011-06-19 28 views
6

Tôi muốn triển khai transientpersistent! trong định dạng Clojure của mình. Theo như tôi có thể nói, điều này có nghĩa là có một deftype, TransientMyThing, thực hiện các phương pháp cần thiết. Được rồi cho đến nay, nhưng hai lớp đó cần phải biết về nhau để trả lại các thể hiện của nhau.Cùng nhau giới thiệu các loại vi phạm trong Clojure

Tôi nghĩ tôi có thể làm điều đó bằng cách chuyển tiếp các hàm Clojure chuyển tiếp và tạo liên tục, sau đó xác định deftype (bằng cách tham khảo hàm đó), sau đó thực hiện các chức năng với các kiểu hiện có, nhưng có vẻ như khá thô với tôi. Có lựa chọn nào tốt hơn không?

Chỉnh sửa: hoạt động, nhưng nó vẫn còn thô.

+0

không thể kiểm tra ngay bây giờ nhưng có thể thêm chức năng sau khi bạn đã xác định hai loại sử dụng "loại mở rộng"? – mikera

+4

Hiện tại, không có tùy chọn nào khác ngoài việc tuyên bố về phía trước các hàm trợ giúp. Tôi không nghĩ rằng nó sẽ phải chịu một hình phạt hoàn hảo đáng chú ý (đặc biệt là trong 1.3). Tuy nhiên có một thứ khác có thể hoạt động: định nghĩa kiểu transient với reify bên trong phương thức asTransient - Tôi không kiểm tra nhưng có nhiều cơ hội bạn sẽ đạt tới giới hạn trình biên dịch khác (nếu stack trace nói về một stub, đó là cái) . – cgrand

+0

Nhận xét của cgrand thật hoàn hảo. Tôi chấp nhận nó nếu nó là một câu trả lời; chỉ cần thêm một bình luận ở đây để bất cứ ai xảy ra qua câu hỏi đều biết cách giải quyết nó. – amalloy

Trả lời

4

Trong Clojure 1.3 trở lên, giải pháp đơn giản hơn một chút là dựa vào các hàm dựng mà Clojure tạo cho các định dạng của bạn, -> thoáng qua và -> liên tục !. Vì đó là các hàm và không phải macro, bạn có thể chuyển tiếp khai báo chúng. Sau đó, bạn có thể sử dụng chúng, chứ không phải của riêng bạn làm cho thoáng qua và làm cho dai dẳng, và bạn không cần phải thực hiện chúng mình.