[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 メーリングリストの案内