проблема в сворачиваниии числового диапазона в кольцо.
Если вы действительно хотите оперировать какими-то числами в произвольном диапазоне и не думать ни о чем, то придется посмотреть что делали люди до того. Например, FSL(Forth Scientific Library) содержит что-то подобное в строках файла big.f, или взять полиномиальное представление чисел с заданным основанием системы счисления.
Код:
\ вводим число, по окончании ввода на вершине стека число двойной размерности
: ?INPUT ( - | d )
PAD 23 BLANK \ заполнять обязательно пробелами, и ничем иначе
PAD 21 ACCEPT \ собственно ввод
PAD SWAP NUMBER? \ преобразование строку ввода в число
1- ?DUP IF 1- THROW \ генерируем исключение в случае ошибки преобразования
ELSE S>D THEN ; \ если число одинарной размерности, то его преобразуем
\ обработчик ввода
: (INPUT) ( - d )
['] ?INPUT CATCH \ защищаем ввод, так как неизвестно, что может твориться в ЭВМ
?DUP IF CR ." INCORRECT" \ уведомляем пользователя о неправильном вводе
THROW THEN ; \ заставляем вызвавшее слово, повторить процедуру сначала
: INPUT ( xt - d )
BEGIN
DUP EXECUTE \ отображаем приглашение ввода
['] (INPUT) CATCH
0= UNTIL ROT DROP ; \ удаляем токен-указатель на приглашение ввода
\ различные сообщения выводимые на экран
: ."A=" CR ." A=" ;
: ."B=" CR ." B=" ;
: ."A+B=" CR ." A+B=" ;
\ собственно тело программы
: MAIN
['] ."A=" INPUT
['] ."B=" INPUT
."A+B=" D+ D. ;
вот такой вот получился код, преследуя
универсальность он сильно
раздулсяПопробуй использовать это определение, может имелось ввиду особенность работы слова преобразователя, сообщая что не так числа преобразуются:
Код:
: ?INPUT ( - | d )
PAD 22 BLANK \ заполнять обязательно пробелами, и ничем иначе
PAD 21 ACCEPT \ собственно ввод
[CHAR] , OVER PAD + C! \ допишем знак для нужного преобразования
PAD SWAP 1+ NUMBER? \ преобразование строку ввода в число
2- THROW ; \ теперь это выход с уведомлением о том, как прошло преобразование