のこのコードの出力に矛盾があることに気付きましたClisp
:
(defvar str "Another")
(setf (char str 3) #\!)
repl から実行すると、目的の結果が得られます。
[1]> (defvar str "Another")
STR
[2]> (setf (char str 3) #\!)
#\!
[3]> str
"Ano!her"
[4]>
ただし、スクリプトから実行すると、読み取り専用文字列の変更に関する警告が表示されます。
*** - Attempt to modify a read-only string: "Another"
このコードを実行すると、次のエラーが発生しました。
(print (do ((str "foobar")
(i 0 (+ i 1)))
((= i (length str)) str)
(setf (char str i) #\!)))
ブロックが終了するとバインディングが消えるときに、文字列を作成するポイントは何ですかread-only
(これは と同じであると想定しています)。immutable
そして、なぜ 2 つの出力が一致しないのでしょうか?
最後に、それをオフにする方法はありますか?警告が特に役立つとは思いません。