[SML 7039] Re: じゅんテキストブック

AOKI Atsushi aoki @ sra.co.jp
2005年 2月 26日 (土) 15:42:40 JST


SRA先端技術研究所の青木です。

昨年の末に次のようなアナウンスをさせていただきました。

AOKI Atsushi wrote (29 Dec 2004 11:36:45):
> じゅんのテキストブックに載っているプログラムをチェックして、
> VisualWorks 7.x / 5i.x / 3.x のすべてに対応させました。
> http://www.sra.co.jp/people/aoki/TextbookAboutJun/
> 読み進める際には、Jun611 もしくは Jun499v15 を用いてくださる
> ようお願い申し上げます。年末年始の Smalltalking に、どうぞ!
> なお、絵図が挿入された HTML 版のじゅんテキストブック(浅岡さ
> んのウェブページ)は、新年早々に対応してくれると思います。

やっと絵図が挿入された HTML 版のじゅんテキストブックも修正が
完了したようです。お待たせいたしました。どうぞご利用ください。

http://www.sra.co.jp/people/h-asaoka/study/TextbookAboutJun/

そういえば、VisualWorks に名前空間がサポートされるようになっ
てから、新たに追加されたプログラム制御構造があります。fold:
というメッセージセレクタです。ご存知だったでしょうか?

集まりをレシーバにして、ブロック・クロージャを引数に取ります。
たとえば、次のように用います。

	| aCollection aString |
	aCollection := Array
				with: 'aaa'
				with: 'bbb'
				with: 'ccc'
				with: 'ddd'.
	aString := aCollection fold: [:first :second | first , '.' , second].
	Transcript
		cr;
		show: aString printString.
	^aString

実行すると、トランスクリプトには「'aaa.bbb.ccc.ddd'」と出力さ
れます。4 つの文字列の間に 3 つのピリオドが挿入されています。

動きをさとるために、fold: のブロック・クロージャの中で第一引
数と第二引数を一段下げて出力するようにしてみましょう。

	| aCollection aString |
	aCollection := Array
				with: 'aaa'
				with: 'bbb'
				with: 'ccc'
				with: 'ddd'.
	aString := aCollection fold:
					[:first :second |
					Transcript
						cr;
						tab;
						show: first printString;
						space;
						show: second printString.
					first , '.' , second].
	Transcript
		cr;
		show: aString printString.
	^aString

そうすると、トランスクリプトの出力は、以下の通りになります。

	'aaa' 'bbb'
	'aaa.bbb' 'ccc'
	'aaa.bbb.ccc' 'ddd'
'aaa.bbb.ccc.ddd'

ブロック・クロージャで求めたものが、次にブロック・クロージャ
が評価される際の第一引数になってくるわけです。

名前空間の継承を「Root.Smalltalk.Graphics.CompositeFont」のよ
うに文字列として書き出す場合に多用されているんです。

また、数の集まりの合計を求める際にも重宝するのではないかしら。

	| aCollection aNumber |
	aCollection := 1 to: 10.
	aNumber := aCollection fold: [:first :second | first + second].
	Transcript
		cr;
		show: aNumber printString.
	^aNumber

初期合計が 0 と決まっているならば、次のような inject:into: の
プログラム制御構造を用いるよりも好ましいと思います。

	| aCollection aNumber |
	aCollection := 1 to: 10.
	aNumber := aCollection inject: 0 into: [:first :second | first + second].
	Transcript
		cr;
		show: aNumber printString.
	^aNumber

Smalltalk の良さの一つに、プログラム制御構造を自らがデザイン
して、Smalltalk (プログラミング言語)の中に組み込めてしまう
ことがあげられます。

------------------------------------------------------------
R2D2 (AOKI Atsushi)        http://www.sra.co.jp/people/aoki/





SML メーリングリストの案内