ゆの in Smalltalk (その2)
むちゃぶりとの指摘をうけてw、やっぱり投げっぱなしはいけないと思い直し、非力ながら ゆの in Smalltalk - みねこあ の再チャレンジしてみました。
Object subclass: #X instanceVariableNames: 'str' classVariableNames: '' poolDictionaries: '' category: 'Yuno'
X class >> / value ^X new , 'スケッチ' X >> , value str := str, value X >> / value str := str, '365' X >> < msg str := str, ' ', msg X >> initialize str := 'ひだまり' X >> printString ^str
ここまでは昨日どおり。問題は '_' が Smalltalk では代入で、そのままでは ゆのっち を作れないという壁でした。
* * *
それに対して今日はは、Squeak Smalltalk の Scanner を ちょめちょめ してあげて解決することにします。まず、Scanner class >> initialize メソッドを以下のように...
Scanner class >> initialize | newTable | newTable := Array new: 256 withAll: #xBinary. "default" ・ ・ ・ newTable at: $^ asciiValue put: #upArrow. newTable at: $_ asciiValue put: #xYuno"#leftArrow". newTable at: $| asciiValue put: #verticalBar. TypeTable := newTable "bon voyage!"
TypeTableの $_ に対応するタイプを #leftArrow から #xYuno なる謎のタイプに変更します。次に対応するスキャンメソッド
Scanner >> xYuno tokenType := #number. token := 0. self step
を作成します。
Scanner は スキャン中に $x で始まるタイプを持った文字から始まる文字列を発見したとき、同名の マルチキャラクタスキャン メソッドを呼んでくれます。それを利用して $_ の解釈ルールをかえちゃったわけです。
ここまでで準備は完了。満を持して TypeTable を上書きです。
Scanner initialize
これで このSqueak Smalltalk環境は、ピンの _ が リテラルの 0 と同じになりましたw
で、満を持して ゆのっち を ワークスペースで print it!
X / _ / X < '来週も見てくださいね!'
よかった、できて。
追記
sumim さんの回答が。
ゆの in Squeak Smalltalk - Smalltalkのtは小文字です
うはぁ、なんですか、こりは(ほめ言葉)
2行で、ゆのっち が do it できるようになってる。わたしってば...orz
追記 (2007-07-13)
/ が 引数を無視しているのは美しくないのと、Scanner のタイプテーブル書き換えは ワークスペースからお手軽にできたっけ(クラス変数を外から変更できたっけ)、というあたりを ちょっとだけ改良。
まずは X クラスの作成
Object subclass: #X instanceVariableNames: 'str' classVariableNames: '' poolDictionaries: '' category: 'Yuno-in-Smalltalk'
X class >> / value ^X new / value X class >> asString ^'x365' X >> initialize str := 'ひだまり' X >> / value str := str, value asString X >> < message self / ' ' / message X >> printString ^str
leftArrow こと '_' は Scannar が 'スケッチ' という文字列リテラルだと思い込むように xYuno という マルチキャラクタスキャンメソッドを追加し、
Scannar >> xYuno tokenType := #string. token := 'スケッチ'. self step
ワークスペースから、Scanner のタイプテーブルで $_ の解釈を #leftArrow から #xYuno に変更します。
(Scanner classPool at: #TypeTable) at: $_ asciiValue put: #xYuno.
X / _ / X < '来週も見てくださいね!'
遊び終わったら、壊れた環境を直すことを忘れずに。
"実行後は↓を do it して必ず元に戻すこと" (Scanner classPool at: #TypeTable) at: $_ asciiValue put: #leftArrow
* * *
変態さ(ほめ言葉)のみじんもない面白みのないコードですが、頭の固い私らしい終着点ということで(^^;