接受变量的用户输入



因此,对于以前使用过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大小。

相关内容

  • 没有找到相关文章

最新更新