2

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

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

    VARIABLE Height 5 ALLOT
    : setHeight 5 ACCEPT ATOI CR ;

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

4

2 回答 2

3

查看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 ;
于 2013-02-03T09:00:14.847 回答
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 大小。

于 2013-03-22T22:55:08.113 回答