リテラルデータの破壊に注意
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のインタプリタですわね。
GaucheはSchemeコードのコンパイルもできると聞いた(ような気がする)ので、コンパイル後実行したらどうなるのかやってみたかったけど、方法が分からなかった。
ってか、コンパイルできたところで、生成されるコードを読めるどうかも分からんけど。
Cで
void foo() { char* str = "hello"; str[0] = 'H'; /* ←だめ */ }
がダメな理由と同じらしい。
あぁ、これってダメなんだっけ。なんでダメなんだっけ?
Cは何年も触ってないから、全然ワガンネ。
GCCでコンパイルしてアセンブリコード出してみれば良いのかもしれないけど、たぶん最適化オプションによって結果も変わるよなぁ。
こんなことでちんたらしてないで、早く読了せねば。