Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб июн 23, 2018 13:54

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: о переменной BASE и словах с ней работающих
СообщениеДобавлено: Пн мар 02, 2009 20:39 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
практически все в форте встречались с проблемой неверного определения текущей системы исчисления,
а так же необходимости часто переключать глобальную переменную 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>

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 02, 2009 20:49 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Я бы предпочёл в стандарте аналог
int printf ( const char *format [, argument, ...]);

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

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 02, 2009 21:43 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6332
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
mOleg писал(а):
практически все в форте встречались с проблемой неверного определения текущей системы исчисления,

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 03, 2009 07:39 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Вот и наступил он, Волшебный Миг Расплаты! Проблема шестого сапога пятой ноги загнана в угол!

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


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

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

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 03, 2009 09:53 
Не в сети

Зарегистрирован: Пн окт 15, 2007 17:24
Сообщения: 164
Откуда: Бийск
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Из вопросов студентам "на засыпку" :) :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

_________________
And so forth ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 03, 2009 13:10 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2107
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Варнак писал(а):
Из вопросов студентам "на засыпку" :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

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

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 03, 2009 21:20 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Варнак писал(а):
Из вопросов студентам "на засыпку" :) :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

она спросит:

"2 ?

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 20:19 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
WingLion писал(а):
mOleg писал(а):практически все в форте встречались с проблемой неверного определения текущей системы исчисления
Можно поподробнее, в чем проблема? А то никак в толк не возьму. Не оставляет ощущение слона выращеного из мухи.

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 20:28 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
mOleg писал(а):
1) постоянно надо сохранять\восстанавливать содержимое переменной BASE


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


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


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

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

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 20:39 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 04, 2009 20:52 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
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 после своей работы, а не переваливает с больной головы на здоровую.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB