类似于"parse-word"的单词,但用于将整数推到堆栈上



我想实现一个DSL,用于在套接字对象上设置端口号。

我希望DSL遵循这个API来设置主机端口号:

host: 8080

如果这是一个字符串操作(比如host: localhost),我可以使用parse-word。不过,这并不理想,因为Forth非常擅长解析数字,而重新发明轮子是件坏事。

Forth中是否有任何标准单词可以获取输入字符串上的第一项,将其解析为数字并将其推送到堆栈中?

>NUMBER是一个将字符串转换为数字的ans单词(在CORE中),但使用起来很麻烦。你的Forth可能有一个更灵活的变体。您的Forth可能还支持像#16 $10 %10000这样的语法,不管BASE如何,这些语法的值都为16。因此,有一种方法可以做到这一点:

: parse-num ( "number" -- n | d | r )  parse-word evaluate ;

或者使用>NUMBER,并且只返回一个单信元编号:

: 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也不处理双数语法。它将在点处停止解析1.。它甚至不处理负数。)

最新更新