代入


今回の演習では、関数型プログラミングの学習のため、 あえて代入操作の方法は教えて来ませんでした。 ただ、プログラミングをしていると、代入操作を行うほうが自然なこともあります。 特に、データ構造を操作したい時は代入操作が行いたくなるものです。

Scheme での代入操作には、

があります。 具体例を用いて簡単にだけ説明しておきます。

> (let ((x 3))    ; 変数 x の値は 3
    (display x)   ; 代入前の値を表示
    (newline)
    (set! x 5)    ; 変数 x に 5 を代入
    x)            ; x の値を返す
3     ; display の結果: 代入前の x は 3
5     ; 式の帰り値:     代入後の x は 5

> (let ((x '(1 2 3 4 5)))  ; 変数 x は (1 2 3 4 5) というリストを指している
    (display x)            ; 代入前の x の示すもの
    (newline)
    (set-car! x 0)         ; x でさされるリストの car field を 0 にして、
    (display x)            ; x の指すものを表示
    (newline)
    (set-car! (cddr x) 'third) ; x でさされるリストの(1から数えて)3番目の要素の
                               ; car field を third にして、
    (display x)                ; 値を表示
    (newline)
    (set-cdr! (cddr x) x)      ; x でさされるリストの(1から数えて)3番目の要素の
                               ; cdr field を、 x で指されていたリストにして、
    x)                         ; x の値を帰り値とする。

(1 2 3 4 5)          ; 代入前をdisplay
(0 2 3 4 5)          ; (set-car! x 0) 後、リストの先頭要素が更新
(0 2 third 4 5)      ; (set-car! (cddr x) 'third) 後、リストの第三要素が更新
#0=(0 2 third . #0#) ; (set-cdr! (cddr x) x) 後、リストの第三要素以降を x に設定、
                     ; リストがサイクル構造になっている。

99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp