Forth
http://fforum.winglion.ru/

о переменной BASE и словах с ней работающих
http://fforum.winglion.ru/viewtopic.php?f=36&t=1989
Страница 1 из 1

Автор:  mOleg [ Пн мар 02, 2009 20:39 ]
Заголовок сообщения:  о переменной BASE и словах с ней работающих

практически все в форте встречались с проблемой неверного определения текущей системы исчисления,
а так же необходимости часто переключать глобальную переменную BASE, а потом ее восстанавливать.
С одной стороны BASE вполне логичная вещь, с которой даже удобно работать в некоторых случаях.
С другой стороны очень часто желательно без нее обойтись.
собственно обойтись без нее достаточно не сложно, достаточно правильно спроектировать интерфейс
слов, работающих с BASE, а именно: >NUMBER <# # , и слов, которые используются для их определения.

начнем с >NUMBER стековая картина у этого слова следующая: ( ud1 asc # --> ud2 asc # )
для того, чтобы отвязаться от глобальной переменной BASE можно явно задать в качестве
параметра необходимую систему исчисления: ( ud asc # base --> ud asc # ) , понятно, что
при этом совместимость со старыми реализациями исчезнет, но этот момент решается просто:
<pre>
: >NUMBER ( ud1 asc # --> ud2 asc # ) BASE @ >number ;
</pre>
>number (можно выбрать и другое имя) и будет иметь нашу стековую картинку: ud asc # base -->

слово >number преобразует число посимвольно, с помощью кода, который можно представить так:
<pre>
: CIPHER ( d x base --> d ) >R U>D DSWAP R> DU* D+ ;
</pre>
- вполне полезное слово, которое можно включить в стандарт.

Что касается преобразования в символьное представление чисел, обчно используются два базовых
слова <# - начало преобразования, # - получение очередного символа, остальные определяются
через них. В данных словах неявно используется BASE, что можно опять же достаточно просто
обойти, введя либо локальную, либо просто дополнительную переменную для хранения системы
исчисления:
<pre>
BASE @ USER-VALUE BASE@ \ в данном случае просто переменная

\ вместо <# которые не имеет на входе параметров определяем {# с входным параметром BASE
: {# ( base --> ) TO BASE@ .... ;

\ а для совместимости со старыми реализациями, определяем <#
: <# ( --> ) BASE @ {# ;
</pre>
Теперь о самом преобразовании, которым занимается слово # . в нем достаточно использовать
нашу новую BASE@ вместо последовательности BASE @ и все:
<pre>
: # ( ud1 --> ud2 )
0 BASE@ UM/MOD
>R BASE@ UM/MOD
R> ROT >DIGIT HOLD ;
</pre>
При минимальных усилиях приведенные методики позволяют часто вообще забыть о глобальной
переменной BASE:
<pre>
: H. ( n --> ) S>D 0x10 {# # # # # # # # # S" 0x" HOLDS #> TYPE ;
</pre>
вместо:
<pre>
: H. ( n --> )
BASE @ >R
S>D HEX <# # # # # # # # # S" 0x" HOLDS #> TYPE
R> BASE ! ;
</pre>

Автор:  вопрос [ Пн мар 02, 2009 20:49 ]
Заголовок сообщения: 

Я бы предпочёл в стандарте аналог
int printf ( const char *format [, argument, ...]);

и
int sscanf (const char *buffer, const char *format [, address, ...]);

Автор:  Hishnik [ Пн мар 02, 2009 21:43 ]
Заголовок сообщения: 

mOleg писал(а):
практически все в форте встречались с проблемой неверного определения текущей системы исчисления,

А некоторые - и с неправильным написанием термина "система счисления"...

Автор:  WingLion [ Вт мар 03, 2009 07:39 ]
Заголовок сообщения: 

Вот и наступил он, Волшебный Миг Расплаты! Проблема шестого сапога пятой ноги загнана в угол!

mOleg писал(а):
практически все в форте встречались с проблемой неверного определения текущей системы исчисления


Можно поподробнее, в чем проблема? А то никак в толк не возьму. Не оставляет ощущение слона выращеного из мухи.

Есть BASE. Есть нормальное правило (у меня во всяком случае) постоянно держать включеным HEX.
Понадобилась другая система счисления - DECIMAL OCTAL BINARY - включил, ввел/вывел что надо, вернул HEX.

Плюс в режиме интерпретации, в строке состояния консоли выводится текущее значение BASE наравне с вершинами стеков и состоянием переменной STATE.
Какие проблемы - не понимаю!

Автор:  Варнак [ Вт мар 03, 2009 09:53 ]
Заголовок сообщения: 

Из вопросов студентам "на засыпку" :) :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

Автор:  chess [ Вт мар 03, 2009 13:10 ]
Заголовок сообщения: 

Варнак писал(а):
Из вопросов студентам "на засыпку" :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

Правильный ответ: :D
1. 10 (при любом BASE > 0x2)
2. Exception #-2003
2 BASE ! BASE @ . 2
^ -2003 WORD OR FILE NOT FOUND
(если BASE уже была 0x2)

Автор:  WingLion [ Вт мар 03, 2009 21:20 ]
Заголовок сообщения: 

Варнак писал(а):
Из вопросов студентам "на засыпку" :) :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

она спросит:

"2 ?

Автор:  mOleg [ Ср мар 04, 2009 20:19 ]
Заголовок сообщения: 

WingLion писал(а):
mOleg писал(а):практически все в форте встречались с проблемой неверного определения текущей системы исчисления
Можно поподробнее, в чем проблема? А то никак в толк не возьму. Не оставляет ощущение слона выращеного из мухи.

1) постоянно надо сохранять\восстанавливать содержимое переменной BASE
2) очень сложно вылавливаемые ошибки, если зевнули с переменной BASE
3) в большинстве случаев система счисления известна заранее, и переключать BASE просто неудобно

Автор:  WingLion [ Ср мар 04, 2009 20:28 ]
Заголовок сообщения: 

mOleg писал(а):
1) постоянно надо сохранять\восстанавливать содержимое переменной BASE


Иногда надо сохранять/восстанавливать BASE, и нет в этом никакой проблемы.


mOleg писал(а):
2) очень сложно вылавливаемые ошибки, если зевнули с переменной BASE


Это проблема вовсе не с BASE... некоторые зевают - ; в конце определения забывают - назовем это проблемой семиколона?

mOleg писал(а):
3) в большинстве случаев система счисления известна заранее, и переключать BASE просто неудобно

в большинстве случаев система счисления известна заранее, и переключать BASE просто ненужно!

Автор:  mOleg [ Ср мар 04, 2009 20:39 ]
Заголовок сообщения: 

WingLion писал(а):
mOleg писал(а):1) постоянно надо сохранять\восстанавливать содержимое переменной BASE
Иногда надо сохранять/восстанавливать BASE, и нет в этом никакой проблемы.

ненужное загромождение кода + некие задержки, которые не являются необходимыми, пример:
<pre>
: H. ( n --> )
BASE @ >R
S>D HEX <# #S S" 0x" HOLDS #>
R> BASE !
TYPE ;
</pre>
в реальности вторая и четвертая строчка лишние, более того, приведенный код не очень проблемный до тех пор, пока он находится внутри одного определения. Стоит разбить на несколько определений, проблемы обостряются(ведь понятно, что приведен простейший из примеров).

WingLion писал(а):
mOleg писал(а):2) очень сложно вылавливаемые ошибки, если зевнули с переменной BASE
Это проблема вовсе не с BASE... некоторые зевают - ; в конце определения забывают - назовем это проблемой семиколона?

нет, это вещи разного порядка. (Впрочем, если у вас есть определения, части которых находятся в разных файлах, то это тоже актуальная проблема была бы).
Вы подключаете новую библиотеку, и у вас все перестает работать, из-за того, что вы понадеялись, что система счисления, к примеру десятичная.
писать же в начале каждого файла BASE @ а в конце BASE ! тоже достаточно неудобно.

WingLion писал(а):
mOleg писал(а):3) в большинстве случаев система счисления известна заранее, и переключать BASE просто неудобно
в большинстве случаев система счисления известна заранее, и переключать BASE просто ненужно!

боюсь, был не правильно понят. Имелось ввиду, что слово работает с известной системой счисления, но, понятно, что слово не должно зависеть от текущего значения BASE. К примеру слово DUMP всегда должно выдавать ШЕСТНАДЦАТИРИЧНЫЙ дамп памяти, и не зависеть от текущей BASE

Автор:  WingLion [ Ср мар 04, 2009 20:52 ]
Заголовок сообщения: 

mOleg писал(а):
ненужное загромождение кода + некие задержки, которые не являются необходимыми, пример:



: H. ( n --> )


BASE @ >R


S>D HEX <# #S S" 0x" HOLDS #>


R> BASE !


TYPE ;


Код:
: HX. DUP 0F AND ALPHA HOLD 2/ 2/ 2/ 2/ ;
: H. <# HX. HX. HX. HX. DROP #> TYPE SPACE ;



mOleg писал(а):
писать же в начале каждого файла BASE @ а в конце BASE ! тоже достаточно неудобно.


Проще сразу написать вначале HEX и в ус не дуть!
А то что кому-то там десятичная система нужна - пусть своей головой думает и переставляет BASE как ему надо.

Надеяться же, что BASE сохранится после загрузки какого-то исходника - смешно-с!

mOleg писал(а):
К примеру слово DUMP всегда должно выдавать ШЕСТНАДЦАТИРИЧНЫЙ дамп памяти, и не зависеть от текущей BASE


Вот, пусть оно само и заботится о восстановлении BASE после своей работы, а не переваливает с больной головы на здоровую.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/