[SML 7476] Re: 第4回Smalltalk勉強会@京都 ダイジェスト
濱崎治
osamu.hamasaki @ gmail.com
2009年 2月 7日 (土) 15:43:55 JST
濱崎です。
2009/02/05 23:59 AOKI Atsushi <atsushi @ cc.kyoto-su.ac.jp>:
> ブラックブックに、2〜35進数までを表示するプログラムが紹介されていますが、
> > なぜそれ35までなのか、というところです。
> > 0〜9の9つの数字、そしてA〜Zのアルファベット26個で数が表現できますが、
> > すべてを使い切れば35個まで、ということになります。
> > ではそれ以上は・・・???
> > さっそく試していた方もいらっしゃったようでした!
>
> どうなるのか、試していた方々、フォローしていただけると幸いです。
>
> --- 青木淳@京都宇治
>
試していた一人です。
次のようなコードを書いていました。
| aStream |
aStream := WriteStream with: String new.
0 to: 300 do:
[:i |
aStream nextPutAll: i printString.
aStream nextPut: $=.
aStream nextPutAll: (i printStringRadix: 300).
aStream nextPut: Character space].
aStream contents
Print Itすると判りますが、キーボードで普通に打ち込めそうなのは71まで。
ですが、コンパイル出来るのは、36進数までですね。$[が出てきたところで、
Syntax Errorになります。
Compiler evaluate: '300r['
をPrint Itすると判ります。
Scannerが字句を読み取る際、数のリテラルを読み取るのに、最終的には
Character>>digitValue
が呼ばれるのですが、このメソッドでは数字として、'0'〜'9'、'A'〜'Z'、'a'〜'z'
しか認めないコードになっています。ですので、数のリテラル表現でコンパイル
可能なのは36進数までということになります。
一方、出力する側はというと
Number>>printStringRadix:
を使うと、最終的には
Character class>>digitValue:
が呼ばれて、10以上の数に対しては、その数に55を足した数に対応する
文字を返すようになっています。数に対応する文字を決めるのはprimitiveに
なっているので、何が返るかはprimitiveがどんな文字コード表に基づいて
実装されているかによります。
以上です。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://www.akademia.co.jp/pipermail/sml/attachments/20090207/ede44aff/attachment.html
SML メーリングリストの案内