vieweditattachhistoryswikistopchangessearchhelp

Smalltalk 理解度チェック

ゆーあいの日記2004年04月24日から、

上手くSmalltalkを学習するには

単純にQ&A方式の問題を作れば良いのでは?と考えています。

起動せよ。オブジェクトを動かしてみよ。Transcriptを表示せよ。doItしてみよう。Imageを保存せよ。変更履歴を見よ。みたいな超入門編とかからはじめるとよいような気がします。

初級編は、目的のコード&モーフを作ったりして。中級編は初級編のコードをリファクタリングするとか。

だれかSqueakのエヴァンジェリスト(伝道者)の方、良い問題を作ってくれませんかねー。私のために。お願いします。

答えはいらないんですかね(^_^;)。あ、Q&A か…(笑)。とりあえず問題を作ってみましょう。Smalltalk っても、Squeak です。--sumim

【Q】 Squeak の起動方法を示せ。
 【A】いくつかの方法がある。

【Q】 ワークスペースを開く方法を示せ。
 【A】いくつかの方法がある。

【Q】 ワークスペースで 3 + 4 を print it、すなわち、式を評価して結果をその場に挿入する方法を示せ。
 【A】3 + 4 とタイプして入力後、

【Q】トランスクリプトを開く方法を示せ。
 【A】原則としてワークスペースと同様のバリエーション。

【Q】3 + 4 を評価してその結果をトランスクリプトに出力するための式を示せ。
 【A】トランスクリプトへの出力は、グローバール変数 Transcript(これはクラスではない! a TrascriptStream が束縛されている…)に show: aString を送信する。パラメータは、文字列オブジェクト(たいていのオブジェクトは printString で変換できる)が望ましいが、文字列としての加工(たとえは別の文字列との連結など)が必要ないなら、そのままでもいける。式でもよい(ただし、コロンの付くキーワードセレクタを含むメッセージの場合は、評価の優先順位の関係で括弧で括る必要があるので注意)。
 改行を含めたいときは、先に cr を送って show: aString を送るか、show: aString を送ってから cr と、続けて endEntry を送る。

【Q】分数「4分の3」を作る式を示せ。
 【A】いくつかの方法がある。

【Q】分数「4分の3」を inspect it する方法を示せ。
 【A】いくつかの方法がある。

【Q】分数「4分の3」のクラスを知る方法を示せ。
 【A】いくつかの方法がある。

【Q】分数クラスの定義をブラウズする方法を示せ。
 【A】いくつかの方法がある。

【Q】分数クラスに定義されているメソッド名(セレクタ)を一覧する方法を示せ。
 【A】いくつかの方法がある。

【Q】分数クラスのインスタンスが反応できるメッセージ(…を構成するセレクタ)の一覧を呼び出す方法を示せ。
 【A】いくつかの方法がある。

【Q】「3の4乗」を計算する式を示せ。
 【A】3 raisedTo: 4
  探し方:デスクトップメニュー → open... → method finder でメソッドファインダを起動。左上の入力欄に、3. 4. 81 とレシーバ(この場合は 3 )、パラメータ(同、4 )、期待する結果(同、81 )をピリオドとスペースで区切って入力して enter か accept(alt/cmd + s)。すると、すぐ下の枠に、該当するメッセージ式と結果の組み合わせが列挙される。

【Q】3 ** 4 が「3の4乗」を求める式になるように、クラス「Number」に、新しいセレクタ「#**」とそのメソッドを定義する手順を示せ。
 【A】システムブラウザを起動し、Number をブラウズ。
    1. メッセージカテゴリ一覧枠から mathematical functions をクリックして選択。
    2. コード枠(下の大きな枠)で次のコードを入力
      ** aNumber
      	^self raisedTo: aNumber
    3. accept(alt/cmd + s)

【Q】新しく定義したメソッドを file out する方法を示せ。
 【A】いくつか方法がある。

【Q】環境の状態を保持せずに終了する方法を示せ。
 【A】いくつか方法がある。

【Q】file out した .st 、.cs ファイルを file in する方法を示せ。
 【A】いくつかの方法がある。

【Q】環境の状態を保持して終了する方法を示せ。
 【A】いくつか方法がある。
ただし、いずれも今ある仮想イメージファイル(.image)を上書きしてしまうので、動作が不安定な場合は別名で保存後、あらためて終了することが推奨される。別名で仮想イメージを保存するには次のような方法がある。

【Q】デスクトップの任意の矩形範囲の画像と同じ内容のスケッチモーフを作って、ピックアップした状態に至るための式もしくはコードを示せ。
 【A】
(SketchMorph withForm: Form fromUser) openInHand


【Q】デスクトップの任意の矩形範囲の画像と同じ内容のスケッチモーフを作り、元の画像と重なるように配置後、編集状態(スケッチエディタが起動した状態)に至る式もしくはコードを示せ。
 【A】
| rect form sketch |
rect _ Rectangle fromUser.
form _ Form fromDisplay: rect.
sketch _ SketchMorph withForm: form.
sketch position: rect origin.
sketch openInWorld.
sketch editDrawing.

--minami

【Q】あるクラス Hoge において、そのインスタンス変数に束縛されているオブジェクトを返すメソッド、あるいはそのインスタンス変数に新たにオブジェクトを束縛するメソッドが分類されるべきカテゴリは何か。
 【入門者向けA】accessing
 【A】accessing もしくは、状況によっては private 。

【Q】examples というカテゴリに属するメソッドをすべて列挙したブラウザを呼び出すコードを示せ。
 【A】
Smalltalk browseAllMethodsInCategory: 'examples'


【Q】example で始まるカテゴリに属するメソッドをすべて列挙したブラウザを呼び出すコードを示せ。
 【A】
| pattern methodsList |
pattern _ 'example*'.
methodsList _ SortedCollection new.
Cursor wait showWhile: [Smalltalk allBehaviorsDo: [ :class |
	| organization categories |
	organization _ class organization.
	categories _ organization categories select: [ :category | pattern match: category ].
	categories do: [ :category | 
		| selectors |
		selectors _ organization listAtCategoryNamed: category.
		selectors do: [ :selector | methodsList add: class name, ' ', selector ]]]].
Smalltalk browseMessageList: methodsList name: pattern.
^ methodsList size


【Q】初期化メソッドを分類する initializ で始まるカテゴリそれぞれの使用頻度を調べよ。
 【A】
| bag |
bag _ Bag new.
Smalltalk allBehaviorsDo: [ :class |
	bag addAll: (class organization categories select: [ :category | 'initializ*' match: category ])].
^ bag sortedCounts

=> a SortedCollection(497->#initialization 164->#initialize 159->#'initialize-release' 
3->#initializing 2->#'initialize-destroy' 1->#'initialization-release' 
1->#'initialize/release' 1->#'initialize variables' 1->#'initialize-reset-release')

(ここまで、署名なきものは)--sumim


コメント


クラスの使い方がわからないときどうするか、みたいなのが欲しいなぁ..。と思います。知識だけではなくて、解決法、みたいな。--spiral

たとえばどんなのがいいですかね…。私が考えると、注目するクラスに特徴的なメソッドを探すための知識(カテゴリの紳士協定に関する知識など)を問う、やっぱり知識だけの問題に帰着しちゃいそうで(^_^;)。--sumim

う、どうでしょう...。 Java みたいに情報が分散している環境だと「あー、このクラスのメソッドなんだっけ」となった時にジャヴァドッグを web ブラウザで開いて Ctrl-F して... で、エディタに戻って.. なんて事になるわけですが、 Smalltalk だと...みたいな感じでしょうか。あと、 Exception ダイアログが開いた時にどうするか、とか。 私は人が Smalltalk でプログラムを書いているのをあまり見た事ないので、他人がどうやって Exception とか解決するのか、など気になりますねぇ。
とにかく Smalltalk って、環境によっていろんなモノが違うじゃないですか。知識もとっても大切ですけれど、解決方法って環境が違っても共通だったりするんで。--spiral


ひとつだけとんでたので、ついつい手が。--minami


最初の方のも解答をお願いします。--yebisu


minami さん、
いえいえ、助かります。--sumim

yebisu さん、
だいぶ時間が経ってもう用をなさないとは思いましたが、書き加えてみました。--sumim
- 2006-07-02, 14:47:43



このページを編集 (12305 bytes)


Congratulations! 以下の 2 ページから参照されています。

This page has been visited 4711 times.