COMMON LISP JP > Archives > 2011/07/01

2011/07/01 03:48:51 UTCmaru
#
ここでundefeinedて定義されているのと関係ありますか?(変な日本語だな) http://www.lispworks.com/documentation/HyperSpec/Body/s_quote.htm#quote
#
CLtL2はいま手元にないス
2011/07/01 06:01:31 UTCshiro
#
aa,
2011/07/01 06:05:33 UTCshiro
#
ああ、undefinedって明記してありますね。CLtL2のrplacaの項 (p.423) に
#
(setq g '(a b c))
(rplaca (cdr g) 'd) => (d c)
Now g => (a d c)
#
っていう例が上がってるんですが、HyperSpecの方が正式だろうからCLtL2のは見過ごしかな。
2011/07/01 06:19:17 UTCmaru
#
でもこの動作に依存したコードって書いてた気が... 偶然動いてたのか。こわい(>_<)
2011/07/01 06:26:57 UTCshiro
#
Schemeはわりとそのへんうるさい感じがします。Gaucheはコンスに関しては厳密にチェックしてないですが。
#
ACLだと (setf (aref "abc" 0) #\Z) なんかも通るんだなあ。
#
Gaucheでは (set! (~ "abc" 0) #\Z) はエラー。
2011/07/01 06:35:10 UTCzick
#
CLHSはリテラルのmodifyが未定義と書いてあるにもかかわらず、例ではmodifyしまくっているという謎。 http://www.lispworks.com/documentation/HyperSpec/Body/m_push.htm
2011/07/01 06:37:48 UTCshiro
#
CLHS自身もか! 歴史的に昔は普通だったのでみんなあんまり考えてないのかも。
#
あ、昔は普通(にリテラルを変更してた)、っていうのは私の想像だけれども。
2011/07/01 06:38:20 UTCmaru
#
これは...
2011/07/01 07:16:48 UTCshiro
#
まあ、immutableかどうかのチェックを常にやるのはオーバヘッドがあるからCLでは嫌われるかも。バッチコンパイルした場合はread-onlyなページに載せちゃえばSEGVで捕まえられるんでノーコストだけど、それはそれで「REPLでは動いてたのにコンパイルしたらSEGVった」っていういやなパターンになりそうだ。