「ある値にすでに束縛されているシンボル」を変数(varialbe)と呼ぶならば、
Schemeではset!を使ってその値を破壊的に変更することができます。
例えば、シンボルnを数値0に束縛します。
gosh> (define n 0)
n
gosh> n
0
ここでnを使う手続きを書いてみましょう。
gosh> (define (add-n x)
(+ x n))
add-n
これは引数にnの値を足すような手続きです。値をこの手続きに渡すと、
gosh> (add-n 10)
10
gosh> (add-n 35)
35
nを束縛している値は数の0なので渡された数がそのまま返されます。
ここでnを3に破壊的に変更してみます。
破壊的変更を行うにはset!という特殊形式を使います。
set!は手続きではありません。
特殊形式については「特殊形式」で説明します。
gosh> n
0
gosh> (set! n 3)
3
gosh> n
3
破壊的に変更したのでnの値が数の3に変わりました。
もう一度先ほど定義したadd-n手続きを適用してみましょう。
gosh> (add-n 10)
13
gosh> (add-n 35)
38
add-n手続きの振る舞いが変わりました。
Schemeの手続きは評価されたときの情報を持つということを「手続き型」で説明しました。
破壊的変更はその情報を変更できる唯一の方法です。