类似于 "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.。它甚至不处理负数。)