如何读取用户输入的整数并赋予 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 堆栈,执行您需要执行的任何操作,然后将其移回。因此,>r
和 r>
.
虽然接受的答案提供了您想要的,但我不确定您的方法是否符合语言哲学。在我看来在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
完成(针对预定义值调整输入且不进行错误检查)和打印 - 如果需要 - 明确遵循。
我在 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 堆栈,执行您需要执行的任何操作,然后将其移回。因此,>r
和 r>
.
虽然接受的答案提供了您想要的,但我不确定您的方法是否符合语言哲学。在我看来在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
完成(针对预定义值调整输入且不进行错误检查)和打印 - 如果需要 - 明确遵循。