接受变量的用户输入

时间:2013-02-02 20:49:10

标签: variables input forth

所以,对于之前使用过FORTH的人来说,这应该是一个简单的问题,但我是一个新手试图学习如何编写这种语言(这与C ++有很大不同)。

无论如何,我只是想在FORTH中创建一个名为“Height”的变量,我希望用户能够在调用某个单词“setHeight”时为“Height”输入一个值。但是,我尝试的所有内容似乎都失败了,因为我不知道如何设置变量,也不知道如何获取用户输入并将其放入变量中。

    VARIABLE Height 5 ALLOT
    : setHeight 5 ACCEPT ATOI CR ;

我希望这是一个容易解决的问题,任何帮助都将不胜感激。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

查看Rosettacodestring 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大小。