类似于 "parse-word" 的词,但用于将整数压入堆栈
Word similar to "parse-word", but for pushing integers onto the stack
我想实现一个 DSL 用于在套接字对象上设置端口号。
我希望 DSL 遵循此 API 来设置主机端口号:
host: 8080
如果这是一个字符串操作(例如host: localhost
)我可以使用parse-word
。但这并不理想,因为 Forth 非常擅长解析数字,重新发明轮子是一件坏事。
Forth 中是否有任何标准词可以获取输入字符串中的第一项,将其解析为数字并将其压入堆栈?
>NUMBER
是一个ANS词(在CORE中),将字符串转成数字,但是使用起来比较麻烦。您的 Forth 可能有更灵活的变体。您的 Forth 可能还支持像 #16
</code> <code>%10000
这样的语法,无论 BASE
是什么,它们的计算结果都是 16。所以一种方法可以做到这一点:
: parse-num ( "number" -- n | d | r ) parse-word evaluate ;
或者使用 >NUMBER
,只返回一个 single-cell 数字:
: parse-num ( "number" -- n )
0. parse-word >number ( d c-addr u )
abort" not a number" drop
abort" double received where single-cell number expected" ;
如果返回的字符串不是 PARSE-WORD
的整个输出被转换为数字时会产生的空字符串,或者如果双精度数的高位不为 0,则将中止,这如果输入了一个单元格无法表示的数字,就会出现这种情况。 (注意。>NUMBER
也不处理 double-number 语法。它将在点处停止解析 1.
。它甚至不处理负数。)
我想实现一个 DSL 用于在套接字对象上设置端口号。
我希望 DSL 遵循此 API 来设置主机端口号:
host: 8080
如果这是一个字符串操作(例如host: localhost
)我可以使用parse-word
。但这并不理想,因为 Forth 非常擅长解析数字,重新发明轮子是一件坏事。
Forth 中是否有任何标准词可以获取输入字符串中的第一项,将其解析为数字并将其压入堆栈?
>NUMBER
是一个ANS词(在CORE中),将字符串转成数字,但是使用起来比较麻烦。您的 Forth 可能有更灵活的变体。您的 Forth 可能还支持像 #16
</code> <code>%10000
这样的语法,无论 BASE
是什么,它们的计算结果都是 16。所以一种方法可以做到这一点:
: parse-num ( "number" -- n | d | r ) parse-word evaluate ;
或者使用 >NUMBER
,只返回一个 single-cell 数字:
: parse-num ( "number" -- n )
0. parse-word >number ( d c-addr u )
abort" not a number" drop
abort" double received where single-cell number expected" ;
如果返回的字符串不是 PARSE-WORD
的整个输出被转换为数字时会产生的空字符串,或者如果双精度数的高位不为 0,则将中止,这如果输入了一个单元格无法表示的数字,就会出现这种情况。 (注意。>NUMBER
也不处理 double-number 语法。它将在点处停止解析 1.
。它甚至不处理负数。)