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

时间:2018-10-23 17:30:59

标签: function fibonacci 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。

2 个答案:

答案 0 :(得分:6)

您可以使用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?之后,您在堆栈上有三个条目:双精度定点数的两个部分和一个标志-堆栈注释将是:(-n n f)。但是我假设您要使用问题中的代码给出一个单精度数字。

d>s将采用双精度数字并将其转换为单精度。我们需要将标志移开,以便获得号码。暂时移开某事物的标准技巧是将其从数据堆栈移至返回栈,执行所需的任何操作,然后将其移回。因此,>rr>

答案 1 :(得分:2)

虽然接受的答案可以提供,但是我不确定您想要什么,您的方法与语言哲学的契合度如何。我认为在单词中执行输入是其他编程语言的一种方法。

使用以下代码:

: (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完成的,{{1}调整输入的预定义值且没有错误检查),并在需要时明确进行打印。