ゆの 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.

で、ゆのっちワークスペースで print it!

X / _ / X < '来週も見てくださいね!'

遊び終わったら、壊れた環境を直すことを忘れずに。

"実行後は↓を do it して必ず元に戻すこと"
(Scanner classPool at: #TypeTable) at: $_ asciiValue put: #leftArrow


* * *


変態さ(ほめ言葉)のみじんもない面白みのないコードですが、頭の固い私らしい終着点ということで(^^;