お知らせ
SmallTalk R4.1のつくりかた
http://www.smalltalk-users.jp/Home/gao-zhi/dai8kaismalltalkbenkyoukai/shiryou どのようにしてSmallTalk R4.1はできているのか、わりと詳しく解説した文書です。SmallTalk R4.1チャレンジをやる際のヒントになるかもしれません。 |
第1回SmallTalk勉強会
http://www.smalltalk-users.jp/Home/gao-zhi/dai8kaismalltalkbenkyoukai 今回のテーマは「SmallTalk R4.1のつくりかた」について。 SmallTalk R4.1の開発者が、どのようにしてあのようなものを作るにいたったのか、言語で言語を作る喜び、苦労話、自責の念、変態的なテクニックなどについて語ります。 |
[SmallTalk R4.1チャレンジについて]
SmallTalkには、割といろいろな機能がまぜこぜに入っているので、ここでSmallTalk R4.1チャレンジを明確に定義したいと思います。 1. singletonチャレンジ すべてのクラスで有効なsigletonメソッドを提供する。ただしsingletonが呼ばれたときに、シングルトンでなかった既存のインスタンスも、すべてシングルトンにそろえなければならない。 2. gotoチャレンジ ラベルつきのgotoを実装する。ただし言語にあるものを使うのではなく、新たに作成しなければならない。 3. friendメソッドチャレンジ あるクラスのあるメソッドからのみ呼ぶことを許可するfriendメソッドと、拒否を行うenemyメソッドを実装する。詳しくはfriendメソッド, enemyメソッドを参照のこと。 4. finalクラスチャレンジ 継承やソースの変更、クラスの削除等が行えなくなるbeFinalメソッドを実装する。quitFinalで解除できるようにする。 5. aliasチャレンジ 既存のクラスやメソッドに別名をつけて利用できるようにする機能を提供する。ただし言語にあるものを使うのではなく、新たに作成しなければならない。 6. フィボナッチ最適化チャレンジ フィボナッチ数列を求めるメソッドを最適化する機能を実装する。オリジナルのソースは保たれており、ユーザからは最適化が見えないようになっていなければならない。aliasの利用は不可。 Let's do it! |
[お騒がせしました]
皆さんもお気づきのようにSmallTalk R4.1はエイプリルフールのジョークです。 SmallTalkでなく、Smalltalkをよろしくお願いします。 とはいえSmallTalkはきちんと動作しますので、ダウンロードしておかしな機能を味わってみて下さい。 アピールしたかったのはSmalltalkでは言語拡張が非常に容易にできますよということです。 実際にSmalltalkで開発をしていると、アプリケーションを作っているのか、言語を作っているのかだんだんと区別がつかなくなってきます。そのシステムの要件にもっとも都合の良い言語を作ってしまう、それがSmalltalkプログラミングです。内部DSLの構築に非常に向いているわけですね。 SmallTalkをダウンロードしてみて、どんなふうに拡張をしているのか、ソースを眺めてみても良いですし、他のプログラミング言語で、同様の拡張ができるかチャレンジしてみるのも、面白いと思います。(これをSmallTalk R4.1チャレンジと名付けます) それでは、またいつかどこかでお会いしましょう。 P.S. Smalltalkに興味が出てきた方は、ぜひSmalltalk勉強会にもご参加ください。 |
friendメソッド, enemyメソッド
SmallTalk R4.1では、従来のprotected、privateに加え、よりきめ細かなアクセス制御をサポートするfriendメソッド、enemyメソッドの機能を提供しています。 1. friendメソッド 呼び出し元となれる友好オブジェクトの素性を指定します。 MyClass>>friendExample self friend: FriendClass. ... 上記の例では、friendメソッドの引数にFriendClassクラスを指定することで、friendExampleメソッドの利用者をFriendClassのインスタンスのみに制限しています。 friendの条件に合わないオブジェクトがfriendExampleメソッドを呼び出した際には、直ちにFriendNotFoundエラーが生起されます。 friendメソッドの引数には、呼び出し側のクラス(必須)、およびメソッド(オプション)を指定することができます。 -指定例 self friend: Friend. "Friendクラスのインスタンス" self friend: #Friend. "同上" self friend: 'Friend'. "同上" self friend: 'Fr*'. "クラス名がFrで始まるクラスのインスタンス(*はワイルドカード)" self friend: #(FriendA FriendB). "FriendAクラスのインスタンス、およびFriendBクラスのインスタンス" self friend: Friend + #super. ”Friendクラスとそのスーパークラスのインスタンス (サブクラスを指定する場合は次のいずれかを+メソッドの引数とする。 (#super | #superclasses | #parents | #base))” self friend: Friend allSubclasses. "同上" self friend: Friend + #sub. ”Friendクラスとそのサブクラスのインスタンス (サブクラスを指定する場合は次のいずれかを+メソッドの引数とする。 (#sub | #subclasses | #children | #derived))” self friend: Friend allSubclasses. "同上" self friend: Friend + #all. "Friendクラスのインスタンス、およびそのスーパークラス・サブクラスのインスタンス" self friend: Friend allSuperclasses , Friend allSubclasses. "同上" self friend: Friend ->> #aaa. "Friendクラスのインスタンスのaaaメソッド" self friend: Friend ->> #(#aaa #bbb). "Friendクラスのインスタンスのaaaメソッドおよびbbbメソッド" self friend: Friend ->> '*ccc'. "Friendクラスのインスタンスのメソッド名がcccで終わるメソッド" self friend: Friend + #sub ->> #(#ddd 'eee*'). "Friendクラスのインスタンス、およびそのサブクラスのインスタンスで、 dddメソッド、もしくはメソッド名がeeeで始まるメソッド" 2. enemyメソッド 呼び出し元になれない敵性オブジェクトの素性を指定します。 MyClass>>enemyExample self enemy: EnemyClass. ... 上記の例では、enemyメソッドの引数にEnemyClassクラスを指定することで、enemyExampleメソッドの利用者をEnemyClass以外のインスタンスのみに制限しています。 enemyの条件に合致するオブジェクトがenemyExampleメソッドを呼び出した際には、直ちにEnemyFoundエラーが生起されます。 enemyメソッドの引数については、friendメソッドの引数を参考にしてください。 |
メソッド内GOTO
本物のプログラマはGOTOの使用をためらいませんが、SmallTalkは無制限なGOTOを備えていません。 SmallTalkのGOTOには以下のような制限があります。
SmallTalkGotoExample>>exampleFibonacci "フィボナッチ数を求める" | n fibArray i | n := 50. fibArray := Array new: n. fibArray at: 1 put: 0. fibArray at: 2 put: 1. i := 3. self LABEL: #LoopHead. fibArray at: i put: (fibArray at: i - 1) + (fibArray at: i - 2). i := i + 1. (i <= n) ifTrue: [self GOTO: #LoopHead]. Transcript cr; show: fibArray printString. |
PHP風SORT
SmallTalkのCollectionクラスには、PHP言語にインスパイアされたインテリジェントなソートメソッドが実装されています。 #('1e1' '1f1' '9') shuffled SORT => #('1e1' '1f1' '9') or #('1f1' '1e1' '9') ソートメソッドの引数に以下のSymbolを与えることで、ソートの動作を修正するために使用することも可能です。 #REGULAR - 通常通りに項目を比較(default) #NUMERIC - 数値的に項目を比較 #STRING - 文字列として項目を比較 #('1e1' '1f1' '9') shuffled SORT: #NUMERIC => #('1f1' '9' '1e1') 参考:PHP: sort - Manual |
順序つきHash
SmallTalkのHashは、値を登録した順序でいつでもキーや値を取り出すことができる、オシャレで便利なCollectionクラスです。 | hash | hash := Hash new at: #z put: 30; at: #x put: 10; at: #y put: 20; yourself. hash keys. "#(#foo #bar #boo)" hash values. "#($a $b $c)" |
ナベアツモード
「ナベアツモード」では、あなたと対話するSmallTalkが3がつく数字の時だけアホになります※。 以下の式を評価すると、 ナベアツモードが有効になります。 SmallTalkSettings nabeatsuMode: true. ※3の倍数でもアホになる本家「世界のナベアツ」にはかないません。 |
ゆとりモード
プログラミングにゆとりと潤いを求める。そんなあなたのために、SmallTalkには「ゆとりモード」が搭載されています。 以下の式を評価すると、ゆとりモードが有効になります。 SmallTalkSettings yutoriMode: true. ゆとりモードが有効になると、直ちに世界の円周率は3になります。 実際にそのときが来るまで何が起こるか分かりませんが、どんなことが起こっても、「なるほど、こんな弊害があるのですね。ゆとりだから仕方ありません」と、余裕をもった上から目線で対処するようにしてください。 |
1-10 of 23