让我特别喜欢Smalltalk的一点是有能力用基数进行算术运算不同整数。我想没有其他语言能做到这一点。
请参阅下面的代码。
Transcript show: 16raf * 32; cr.
Transcript show: 7r21 - 5r32; cr.
输出为
5600
-2
我知道,如果数字是十六进制(基于16),abcdef可以被雇佣。但是如果我想作为基数的整数是250呢。在某些位置上,有60个。我怎样才能把那个数字打出来?
简短回答:如果不更改解析器,就不能为36以上的任意基数键入任意数字。
更长的答案:
您可以使用36以上的任意基数,但打印和写入需要36以上符号的数字时会遇到问题。
你可以检查一个基地的所有符号:
base := 36.
number := 0.
1 to: base - 1 do: [ :i |
number := number * base + i
].
number printStringBase: base.
上面的结果是下面的
'123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
在SmallInteger>>printOn:base:length:padded:
中打印时,这也是硬编码的
注意,对于小于基数的数字,printStringBase:
将直接使用ascii。
36 printStringBase: 37 '['
但是,即使你取消了硬编码限制,直接使用ascii,你也于事无补。
您迟早会需要在语法中具有不同含义的ascii符号。例如,后面的Z
(ascii 90)是用于启动块的[
(ascii 91)。
因此,37r2[
将被解析为37r2
,而[
将被保留用于块(因此将导致语法错误)。
但除此之外,你可以使用任何基础
2001rSpaceOdyssey -> 57685915098460127668088707185846682264