所以,对于之前使用过FORTH的人来说,这应该是一个简单的问题,但我是一个新手试图学习如何编写这种语言(这与C ++有很大不同)。
无论如何,我只是想在FORTH中创建一个名为“Height”的变量,我希望用户能够在调用某个单词“setHeight”时为“Height”输入一个值。但是,我尝试的所有内容似乎都失败了,因为我不知道如何设置变量,也不知道如何获取用户输入并将其放入变量中。
VARIABLE Height 5 ALLOT
: setHeight 5 ACCEPT ATOI CR ;
我希望这是一个容易解决的问题,任何帮助都将不胜感激。 提前谢谢。
答案 0 :(得分:2)
查看Rosettacode的string or number input in FORTH输入/输出示例:
字符串输入
: 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 ;
答案 1 :(得分:0)
要记住你的自我修饰的一个重点--C ++是强烈的类型,Forth完全相反。你想要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大小。