如何读取用户输入的整数并赋予 Forth 函数?

How to read user input of integer number and give to function in Forth?

我在 Forth 中写了一段代码来计算第 9 个斐波那契数:

." Fibonacci numbers"
: INP 9 0 ;
: FIB_0 1 0 1 ;
: FIB FIB_0 INP DO  + SWAP OVER LOOP SWAP . ;

现在我想从用户输入中读取整数 N 并将其提供给 INP 而不是 9 以便我可以计算任意整数斐波那契数。我在 Windows.

上使用 Gforth

您可以使用 accept 获取用户输入,然后 s>number? 尝试将其转换为数字。 accept 需要内存地址和最大长度。 's>number?` 留下一个双精度和一个标志。

所以你可以做类似的事情

: fetch-input ( - n f ) 
     pad 40 accept   
     pad swap s>number? 
     >r d>s r> ;

如果 s>number? 无法将字符串转换为数字,它将在堆栈的标记下留下 0 0

所以在 s>number? 之后,堆栈上有三个条目:双精度定点数和标志的两部分--堆栈注释将是 : (-nnf)。但我假设你想要一个单一的精度数字给定你问题中的代码。

d>s 将采用双精度数并将其转换为单精度数。我们需要把旗帜移开,这样我们才能得到数字。暂时将某些东西移开的标准技巧是将其从数据堆栈移至 return 堆栈,执行您需要执行的任何操作,然后将其移回。因此,>rr>.

虽然接受的答案提供了您想要的,但我不确定您的方法是否符合语言哲学。在我看来在word中执行输入是其他编程语言的一种方法。

使用此代码:

: (fibo-iter) ( n n - n n) swap over + ;
: th-fibo ( n - n) >r 1 dup r> 2 - 0 do (fibo-iter) loop nip ;

可以写:

10 th-fibo .

生成第十个斐波那契数。输入在堆栈上提供,计算由 th-fibo 完成(针对预定义值调整输入且不进行错误检查)和打印 - 如果需要 - 明确遵循。