[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 メーリングリストの案内