标准只规定了一个低水平
>NUMBER
用于解释整数的单词。
耳鸣
EVALUATE
把字符串转换成数字是一种快速而肮脏的方法。要么不用检查就使用它(在可信输入的情况下),要么根本不用它。尝试在之前筛选字符串
评价
是个坏主意:它有成本
>数字
词本身和低重用因子。
注:
也不
>数字
也不是
评价
检测数值溢出。
在任何情况下,输入单单元格整数的单词都可以定义如下:
: accept-number ( -- n )
PAD DUP 80 ACCEPT ( addr u ) StoN ( n )
;
在可信输入的情况下,可以定义
StoN
喜欢
: StoN ( addr u -- x )
STATE @ ABORT" This naive StoN should not be used in compilation state"
DEPTH 2- >R
EVALUATE
DEPTH 1- R> <> IF -24 THROW THEN
\ check depth to accept the single-cell numbers only
;
否则(对于不受信任的输入),您有两种选择:依赖于特定Forth系统的特定单词,或者使用某些(可能是您自己的)库。
我用下面的词典来定义
斯通
:
\ ---
\ The words from Substring Matching library
\ (where length is counted in address units)
: MATCH-HEAD ( a u a-key u-key -- a-right u-right true | a u false )
2 PICK OVER U< IF 2DROP FALSE EXIT THEN
DUP >R
3 PICK R@ COMPARE IF RDROP FALSE EXIT THEN
SWAP R@ + SWAP R> - TRUE
;
\ ---
\ The words from Literals interpreting library
\ (where prefix 'I-' is shortcut for Interpret)
: I-DLIT ( a u -- x x true | a u false )
2DUP S" -" MATCH-HEAD >R
DUP 0= IF NIP RDROP EXIT THEN
0 0 2SWAP >NUMBER NIP IF RDROP 2DROP FALSE EXIT THEN
R> IF DNEGATE THEN 2SWAP 2DROP TRUE
;
: I-LIT ( a u -- x true | a u false )
I-DLIT IF D>S TRUE EXIT THEN FALSE
;
之后
斯通
可以定义为:
: StoN ( a u -- x ) I-LIT IF EXIT THEN -24 THROW ;
在GitHub上可以找到提到的库: