Как прочитать пользовательский ввод целого числа и дать функции в Forth? - PullRequest
0 голосов
/ 23 октября 2018

Я написал фрагмент кода в Forth, который вычисляет 9-е число Фибоначчи:

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

Теперь я хочу прочитать целое число N из пользовательского ввода и передать его в INP вместо 9, такчто я мог бы вычислить произвольное целое число Фибоначчи.Я использую Gforth на Windows.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Хотя принятый ответ дает то, что вы хотите, я не уверен, насколько хорошо ваш подход соответствует языковой философии.По моему мнению, выполнение ввода в слове является подходом других языков программирования.

С этим кодом:

: (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, что (корректировка ввода для предварительно определенных значений и без проверки ошибок) и печать - при желании - выполняются в явном виде.

0 голосов
/ 23 октября 2018

Вы можете использовать accept, чтобы получить ввод пользователя, а затем s>number?, чтобы попытаться преобразовать его в число.accept ожидает адрес памяти и максимальную длину.'s> число? `оставляет двойку и флаг.

Таким образом, вы можете сделать что-то вроде

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

Если s>number? не может преобразовать строку в число, оно оставит0 0 под флагом в стеке.

Таким образом, после s>number? у вас будет три записи в стеке: две части числа с фиксированной точкой двойной точности и флаг - комментарий стека будетбыть : (- nnf).Но я предполагаю, что вы хотите однозначное число с указанием кода в вашем вопросе.

d>s возьмет число двойной точности и преобразует его в одинарную точность.Нам нужно убрать флаг с пути, чтобы мы могли добраться до номера.Стандартный прием для временного перемещения чего-либо с пути - это переместить его из стека данных в стек возврата, сделать все, что вам нужно, а затем переместить его обратно.Таким образом, >r и r>.

...