私は Smalltalk リフレクションの研究を行っており、たとえば Ruby で可能になるような個々のオブジェクトを拡張できるかどうか疑問に思っていました。これは、特定のオブジェクトのみが応答するセレクターを意味します。
ここに、私が言いたいことを示す Ruby コードをいくつか示します。明確にするために: Ruby では、このオブジェクトの仮想クラスを開き、新しい定義で拡張します。ここで重要なのは、クラス定義に何も変更がないということです!
o = Object.new
o.instance_eval {def foo;puts "foo";end}
o.foo #=> "foo"
#however this will fail:
m = Object.new
m.foo #=> NoMethod error
より具体的には、標準の Squeak/Pharo またはその他の smalltalk の実装で、これを可能にするための実質的な構造やコードを追加することなく、これが可能かどうかというのが私の質問です。つまり、Smalltalk に存在する通常のリフレクション機能を備えた言葉です。
例として、メソッドの追加、メソッドの削除、新しいコードのクラスへのコンパイル、インスタンス変数の変更などは可能ですが、単一のオブジェクトを拡張する方法は見つかりませんでした。
Test addInstVarNamed: #var.
Test compile: 'var ^var'.
t:= Test new.
Test instVarNames.
t instVarNamed: #var put: 666.
t var. #=> 666
答えが「いいえ」の場合は、その理由を説明してください。私はこの問題を解決しようとしているのではなく、それが smalltalk にない理由を理解しているのです。