郡司です。

> きしもとです

> Fixnum とかシンボルの場合は、同じ値のオブジェクトなら同一のオブジェクトに
> 必ずなるという性質ゆえに、同じリテラル式は毎回同じオブジェクトを返す、
> という感じでしょうか。

ですね。

・「同じオブジェクトを返す」

というのと、

・「同じ値(値としては同じだけどObject IDは異なる)を返す」

というのと、

・「そのオブジェクトがImmutableである」

というのを分けて考える必要がありそうです。


> Ruby とか Python では思いつかないのですが、
> 
> $ gosh
> gosh> (define (foo) '(1 2))
> foo
> gosh> (foo)
> (1 2)
> gosh> (set-car! (foo) 3)
> #<undef>
> gosh> (foo)
> (3 2)

Common Lispでも同じ事を試してみました。

--------
cl> (defun foo () '(1 2))
foo
cl> (foo)
(1 2)
cl> (setf (car (foo)) 3)
3
cl> (foo)
(3 2)
cl>
--------

関数定義中に生成されたオブジェクトは、その関数から
参照され続ける限りは同じもになるのですね。
(なので「同じオブジェクトが毎回返る」「そのオブジェクトは
破壊可能」が満たせる)