豊福@パパイヤです。

青山さん
>>   A = []; B = [];
>>   ...
>>   def e(i); if (i*i >= 0) A; else B ; end
>>
>> e(i) は A しか実際には返しませんが B も参照していると思い
>> ます。
> 
> おそらく B は参照していないと思います。
> メソッドは手続きであり、式 if (i*i >= 0); A; else B; end は B を評価し
> ないので、このメソッド、および式による B の束縛は発生しないと思われま
> す。

  私は「オブジェクトx がオブジェクトy を参照している」とは
「オブジェクトy が GC されたら直接的にオブジェクトx が困る」
というイメージで考えていました。
  普通の処理系の実装で上の例では最適化しない限り B は GC
できないだろうと考えて「B も参照している」と書いたのですが
先のメールに書いたとおり、勝手にある一つの実装を持ってきて
そこから参照を考えたら破綻するようです。ということで上の例
の「B も参照している」は撤回します。

  well-definedな「参照」にするためには

    「オブジェクトx が参照しているオブジェクトの集合」とは
    「万能の神による究極に最適化された実装においてオブジェク
    トx のために GC できないオブジェクトの集合」

いいかえると

    「オブジェクトx のために GC できないオブジェクトの集合
    (これは実装に依存する)のすべての実装に関する共通集合」

にしないとダメかなと思ってます。ただこんな定義で役に立つのか?
---
                        豊福@パパイヤ
                        unbound / papaya.juice.or.jp
                        toyofuku / juice.or.jp