set!
(set! field value)
^:unsynchronized-mutable または ^:volatile-mutable を付けた deftype フィールドに、
その型自身のインラインメソッド内で代入し、値を返します。メソッド内で作った
クロージャは作成時にフィールドをコピーするため、その中の set! は拒否されます。
外側の binding で束縛された ^:dynamic な var へも同様に代入できます。書き込みは
スレッドローカルな値に設定され、その値を返します。束縛内で呼ばれる関数からでも
同様です。いかなる束縛の外側では、値の評価後に実行時エラー
Can't change/establish root binding of: ... with set をシグナルします。これは非
dynamic グローバルの set! と同じエラーです。clojure.core の特殊変数(*out*、
*err*、*print-dup* など)も同様に代入しますが、clojure.main がスクリプトの周りで
束縛するフラグ(*warn-on-reflection*、*unchecked-math*、*print-length*、
*print-level*、*assert* など)は常に束縛されているため、オラクル同様どこでも
set! で代入できます。*ns*、*file*、*1 も同様です。*repl* が束縛されているのは
REPL の中だけです。
それ以外の代入先はオラクル同様に拒否されます。ローカル・パラメータ・不変フィールドは
Cannot assign to non-mutable: ...、ホストフィールドはまだサポートしていません
(java: 表面にフィールド書き込みがありません)。
2 2
2
1
true