在Squeak Smalltalk中,如何键入一个以250为基数的数字



让我特别喜欢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

相关内容

最新更新