2010-06-28 12 views
19

Próbuję Clojure 1.2, specjalnie zmienne pola, które są obsługiwane w deftype zgodnie z clojure.org documentation.Zmutowane pola w Clojure deftype?

Ale nie mogę uruchomić zestawu. Jaka jest składnia aktualizacji pola? Czy jeszcze nie wprowadzono mutability?

(definterface IPoint 
    (getX []) 
    (setX [v])) 

(deftype Point [x] 
    IPoint 
    (getX [this] x) 
    (setX [this v] (set! (.x this) v))) 

user=> (def p (Point. 10)) 
user=> (.getX p) 
10 
user=> (.setX p 20) 
ClassCastException: user.Point cannot be cast to compile__stub.user.Point 

Używanie 1,2 migawki sprzed kilku dni.

Odpowiedz

40

deftype domyślnie nadal mamy niezmienne pola; aby to zmienić, musisz zanotować nazwy pól, które mają być modyfikowane za pomocą odpowiednich metadanych. Również składnia dla pól instancji set! jest inna. Przykładem wdrożenia do powyższych prac:

(deftype Point [^{:volatile-mutable true} x] 
    IPoint 
    (getX [_] x) 
    (setX [this v] (set! x v))) 

Jest też :unsynchronized-mutable. Różnica polega na tym, że nazwy sugerowałyby doświadczonemu programistom Java. ;-) Zauważ, że dostarczanie albo adnotację ma dodatkowy efekt dokonywania pole prywatny, więc bezpośredni dostęp pole nie jest już możliwe:

(.getX (Point. 10)) ; still works 
(.x (Point. 10)) ; with annotations -- IllegalArgumentException, works without 

Również 1.2 będzie prawdopodobnie wspierać składni ^:volatile-mutable x jako skrót dla ^{:volatile-mutable true} x (ta jest już dostępny w niektórych nowych gałęziach numerycznych).

Obie opcje są wymienione w (doc deftype); Odpowiednia część następuje - pamiętaj napomnienie!

Pola mogą być zakwalifikowane z metadanych: lotny-zmienny prawda czy: rozsynchronizowany-zmienny prawda, w tym momencie (set nią Aval!) Będą wspierane w sposób ciał. Zwróć uwagę, że pola zmienne są bardzo trudne w użyciu i są bardzo trudne w użyciu i są dostępne tylko po to, aby ułatwić budowanie wyższych konstrukcji poziomu, takich jak typy odniesienia Clojure, w Clojure . Są one przeznaczone wyłącznie dla ekspertów - jeśli semantyka i implikacje: volatile-mutable lub: unsynchronized-mutable nie są natychmiast widoczne, nie powinieneś ich używać.

+2

Dzięki. Jesteś kopalnią informacji, cieszę się, że cię tu masz :) –

+0

Miło z twojej strony, że tak mówię, dzięki. :-) –

+0

Chcę podkreślić ... znowu ... "nie powinieneś ich używać". Nie używaj: volatile-mutable i: unsynchronized-mutable. Chyba, że ​​już wiesz, to ostrzeżenie nie dotyczy Ciebie i nie rozumiem, dlaczego ponownie ostrzegam ;-) – Jason