2010-03-19 5 views
7

Clojure 구조체는 임의로 확장하여 새 필드를 추가 할 수 있습니다.클로저 유형에 필드를 추가 할 수 있습니까?

deftype을 사용하여 만든 유형을 비슷한 방식으로 확장 할 수 있습니까?

EDIT : 향후 방문자를 위해 Brian이 지적한대로이 기능은 변경 될 수 있습니다.

+0

deftype은 아직 진행중인 작업이며 상황은 변경 될 수 있습니다. 예 : http://groups.google.com/group/clojure/browse_frm/thread/a8b4a1a00fe8d0f2/2ff645127490228b –

+0

감사합니다. 스레드가 도움이됩니다. –

답변

7

실제로 유형을 맵으로 처리 할 수 ​​있으므로 clojure.lang.IPersistentMap을 확장하면됩니다 (구현이 마술처럼 제공됩니다).

(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} 

참고

Clojure의 스플릿을 갖는 사람으로 defrecorddeftype 종류의 의미. 대부분의 응용 프로그램 수준 프로그래밍에서는 레코드를 사용하려고합니다. 편리하게도 그들은 자동으로 clojure.lang.IPersistentMap의 구현을 제공하며 마법은 필요하지 않습니다.

+1

나는 마술처럼 공급되는 것을 좋아한다. 답변 해주셔서 감사합니다. –

+0

이것은 Clojure 1.2에서는 작동하지 않는다. 구현을 제공하지 않고 예상했던 것처럼 java.lang.AbstractMethodError를 얻는다. –

+0

이것은 Clojure 1.2의 초기 베타 릴리스에 유효합니다. 최종 릴리스에서 변경 사항을 언급하기위한 메모를 추가했습니다. –

관련 문제