我想实现一个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.
。它甚至不处理负数。)