vieweditattachhistoryswikistopchangessearchhelp

Squeak の二項メッセージセレクタで使える記号

Ruby の hoge[a] 的記法が、Smalltalk で可能か(結論としては、インタクトには無理)を受けて。

以前から気になっていたので、調べてみました。
| collection usableSymChars |
usableSymChars := '`-=[]\;'',./~!@#$%^&*()_+{}|:"<>?'.
collection := OrderedCollection new.
(Scanner classPool at: #TypeTable) doWithIndex: [ :each :index | 
	| char | 
	char := Character value: index. 
	((usableSymChars includes: char) and: [each == #xBinary]) 
		ifTrue: [collection add: char]].
^ collection collect: [ :each | 
	{each. (Smalltalk numberOfImplementorsOf: each asSymbol) isZero}]
結果は、
#(($! true)
($% true)
($& false)
($* false)
($+ false)
($, false)
($- false)
($/ false)
($< false)
($= false)
($> false)
($? true)
($@ false)
($\ true)
($` true)
($~ true))
で、単独では true のものだけ使えます。false は単独ですでにセレクタとして登録・使用済みのものなので、単独では使用できませんが他の文字と組み合わせて、もちろん、組み合わせた結果が未使用ならば使うことができます。「-」は負数をパースするためのパーサーの都合で、2文字目以降には使えません。

これらの記号を用いた新しい二項メッセージセレクタとして、たとえば
Object >> !! index 
	^ self at: index
と定義すれば、Haskell 風に #((1 2 3) (4 5 6) (7 8 9)) !! 2 !! 3 で 6 を取り出すことなどができるようになります。なお余談ですが、元の #at: はキーワードメッセージセレクタなので、(#((1 2 3) (4 5 6) (7 8 9)) at: 2) at: 3のように同じことをするのにも括弧でくくらなければなりません。二項メッセージセレクタに置き換えるとこうした括弧を省略できるメリットもあります。--sumim

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


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

This page has been visited 3524 times.