編集: 私の質問の以前のバージョンを投稿した後、実際の問題はネストされた関数にあることがわかりました。
内にクロージャーがある場合、そのクロージャー内deftype
から可変フィールドを更新することはできません。
たとえば、次の作品:
(deftype Test [^:unsynchronized-mutable x]
TestInterface
(perform [this o] (set! x o)))
しかし、これはしません:
(deftype Test [^:unsynchronized-mutable x]
TestInterface
(perform [this o] (fn [] (set! x o)) nil)) ; throws a compiler error about assigning to non-mutable field
フィールドに到達してアクセスする方法はありますか? 実行(set! (.x this) o)
すると、次の結果が得られます。
ClassCastException user.Test は compile__stub.user.Test user.Test/fn--152 にキャストできません (NO_SOURCE_FILE:3
コードを実行しようとしたとき。
完全を期すためのコードTestInterface
:
(definterface TestInterface (perform [o]))