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

use*_*747 5 function forth fibonacci

我在Forth写了一段代码来计算第9个Fibonacci数:

." Fibonacci numbers"
: INP 9 0 ;
: FIB_0 1 0 1 ;
: FIB FIB_0 INP DO  + SWAP OVER LOOP SWAP . ;
Run Code Online (Sandbox Code Playgroud)

现在我想从用户输入中读取整数N并将其赋予INP而不是9,以便我可以计算任意整数Fibonacci数.我在Windows上使用Gforth.

Mat*_*rke 6

您可以使用accept获取用户输入,然后s>number?尝试将其转换为数字.accept期望内存地址和最大长度.'s>数字?`留下一个双冠和一面旗帜.

所以你可以做点什么

: fetch-input ( - n f ) 
     pad 40 accept   
     pad swap s>number? 
     >r d>s r> ;
Run Code Online (Sandbox Code Playgroud)

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

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

d>s将采用双精度数并将其转换为单精度.我们需要将标志移开,以便我们可以获得该数字.临时移动某些东西的标准技巧是将其从数据堆栈移动到返回堆栈,执行您需要执行的任何操作,然后将其移回.因此,>rr>.