リテラルデータの破壊に注意

9章5節のコラム「リテラルデータの破壊に注意」。


Schemeの仕様では、リテラルデータを変更することは許されていないそうだ。

gosh> (define *nums* '(1 2 3 4 5))
*nums*
gosh> (set! (car *nums*) 0)  ; やっちゃだめ。
#<undef>
gosh> *nums*
(0 2 3 4)

ってやると、Gaucheではエラーにならないけど、本来はやっちゃダメだ、と。


...ところで、goshってGaucheインタプリタですわね。
GaucheSchemeコードのコンパイルもできると聞いた(ような気がする)ので、コンパイル後実行したらどうなるのかやってみたかったけど、方法が分からなかった。
ってか、コンパイルできたところで、生成されるコードを読めるどうかも分からんけど。


Cで

void foo()
{
  char* str = "hello";
  str[0] = 'H';  /* ←だめ */
}

がダメな理由と同じらしい。
あぁ、これってダメなんだっけ。なんでダメなんだっけ?
Cは何年も触ってないから、全然ワガンネ。
GCCコンパイルしてアセンブリコード出してみれば良いのかもしれないけど、たぶん最適化オプションによって結果も変わるよなぁ。


こんなことでちんたらしてないで、早く読了せねば。