因此,对于以前使用过FORTH的人来说,这应该是一个简单的问题,但我是一个新手,正在尝试学习如何编写这种语言(这与C++有很大不同)。
无论如何,我只是想在FORTH中创建一个名为"Height"的变量,我希望用户能够在调用某个单词"setHeight"时为"Heights"输入一个值。然而,我尝试的一切似乎都失败了,因为我不知道如何设置变量,也不知道如何获取用户输入并将其放入变量中。
VARIABLE Height 5 ALLOT
: setHeight 5 ACCEPT ATOI CR ;
我希望这是一个容易解决的问题,任何帮助都将不胜感激。提前谢谢。
看看FORTH:中字符串或数字输入的Rosettacode输入/输出示例
字符串输入
: INPUT$ ( n -- addr n )
PAD SWAP ACCEPT
PAD SWAP ;
数字输入
: INPUT# ( -- u true | false )
0. 16 INPUT$ DUP >R
>NUMBER NIP NIP
R> <> DUP 0= IF NIP THEN ;
要记住的一点是,C++是大量打字的,Forth则完全相反。您希望Height是字符串、整数还是浮点,它是有符号的还是无符号的?每个都有自己的用例。无论您选择什么,都必须与Height变量交互,并记住您选择的类型。每次都要想想你的点点滴滴意味着什么。
根据您的ATOI调用判断,我假设您希望Height的值为整数。不过,5字节的整数是不寻常的,所以我仍然不确定。但这是一个假设:
VARIABLE Height 1 CELLS ALLOT
VARIABLE StrBuffer 7 ALLOT
: setHeight ( -- )
StrBuffer 8 ACCEPT
DECIMAL ATOI Height ! ;
CELLS调用确保您正在创建一个具有CPU首选位数的变量。DECIMAL调用确保您在ATOI之前的某个位置没有更改为HEX。
创建StrBuffer变量是为字符串获取暂存空间的多种方法之一。假设CELL是16位的,那么一个以零结尾的16位有符号整数最多需要7个字符,例如"-32767\0"。有些实现有PAD,可以使用它来代替创建自己的缓冲区。另一个常见的词是SCRATCH,但我认为它没有按照我们想要的方式工作。
如果你坚持创建自己的字符串缓冲区空间,我个人很喜欢,因为你确切地知道自己有多少空间,那么考虑创建一个大的缓冲区来满足所有单词的字符串处理需求。例如:
VARIABLE StrBuffer 201 ALLOT
这也使您不必进行16位CELL假设,因为200个字符可以很容易地容纳一个64位有符号整数,以防现在或将来某一天您的实现的CELL大小。