[SML 8120] Re: stringを評価可能オブジェクトに変更する方法について
青木 淳
atsushi @ cc.kyoto-su.ac.jp
2015年 3月 14日 (土) 10:30:47 JST
メソッドブラウザを開くように改善してみました。
| aString aCollection aSet |
aString := 'evaluate*'.
aCollection := OrderedCollection new.
aCollection add: ParagraphEditor.
aCollection add: Debugger.
aCollection add: Inspector.
aSet := Set new.
aCollection
do: [:aClass | aClass
methodsDo: [:aMethod | aMethod
messagesDo: [:aMessage | aSet add: aMessage]]].
aCollection := aSet select: [:aMessage | aString match: aMessage asString].
Transcript clear.
aCollection
do: [:aMessage |
Transcript cr; show: aMessage printString.
SystemNavigation default browseAllImplementorsOf: aMessage].
^ aCollection
--- 青木淳
On 2015/03/14 9:36, 青木 淳 wrote:
> おはようございます、青木です。
>
> On 2015/03/13 19:07, Squeak wrote:
> > 青木先生、早急の返信ありがとうございました。
> > 著書を拝読させて頂いております。
> > 早速試してみたいと思います。
>
> 拙著作を読んでいただき痛み入ります。
>
> On 2015/03/14 8:22, Squeak wrote:
> > ご指摘ありがとうございます。
> > 今朝、実際に動かしてみたところ、両方共動くようです。
>
> それは、それは、良かった、幸いでした。
>
> Smalltalk(Squeakでも、VisualWorksでも、…)において、メッセ
> ージの本体(メソッド)を探す出すには、大別するとふた通りある
> と存じます。
>
> 一つ目は、メッセージ名を推測して、メッセージとその本体である
> メソッドを探し出す方法です。(squeak @ cheshireneko.comさんが
> 用いた方法になります。)
>
> 二つ目は、レシーバであるオブジェクトを頼りにして、メッセージ
> とその本体であるメソッドを探し出す方法です。
>
> 今回、私は二つ目の方法を用いました。文字列を評価して結果を出
> しているオブジェクトの代表格は、あらゆるエディタの代表格であ
> る「ParagraphEditor」、そして、「Debugger」になります。また、
> 「Inspector」がありましょう。それらが共通して発信しているメッ
> セージを探すのです。きっと「評価【evaluate】」しているにちが
> いない!と。
>
> すると、以下のものたちが見つかります。あとは、これらの実装者
> をブラウズするだけですよね。
>
> #evaluate:in:to:notifying:ifFail:logged:
> #evaluateSelection
> #evaluateSelectionAndDo:
> #evaluate:in:to:notifying:ifFail:
> #evaluate:in:to:
>
> 以上、速攻の指南でした。お役に立つならば幸いです。
>
> --- 青木淳@以下に二つ目の方法のプログラムを添えておきます。
>
> | collectionOfClasses aSet aCollection |
> collectionOfClasses := OrderedCollection new.
> collectionOfClasses add: ParagraphEditor.
> collectionOfClasses add: Debugger.
> collectionOfClasses add: Inspector.
> aSet := Set new.
> collectionOfClasses
> do: [:aClass | aClass
> methodsDo: [:aMethod | aMethod
> messagesDo: [:aMessage | aSet add: aMessage]]].
> aCollection := aSet
> select: [:aMessage | 'evaluate*' match: aMessage asString].
> Transcript clear.
> aCollection
> do: [:aMessage | Transcript cr; show: aMessage printString].
> ^ aCollection
>
>
SML メーリングリストの案内