Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 12:53

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - о переменной BASE и словах с ней работающих
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
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 после своей работы, а не переваливает с больной головы на здоровую.
Сообщение Добавлено: Ср мар 04, 2009 20:52
  Заголовок сообщения:   Ответить с цитатой
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
Сообщение Добавлено: Ср мар 04, 2009 20:39
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
1) постоянно надо сохранять\восстанавливать содержимое переменной BASE


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


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


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

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

в большинстве случаев система счисления известна заранее, и переключать BASE просто ненужно!
Сообщение Добавлено: Ср мар 04, 2009 20:28
  Заголовок сообщения:   Ответить с цитатой
WingLion писал(а):
mOleg писал(а):практически все в форте встречались с проблемой неверного определения текущей системы исчисления
Можно поподробнее, в чем проблема? А то никак в толк не возьму. Не оставляет ощущение слона выращеного из мухи.

1) постоянно надо сохранять\восстанавливать содержимое переменной BASE
2) очень сложно вылавливаемые ошибки, если зевнули с переменной BASE
3) в большинстве случаев система счисления известна заранее, и переключать BASE просто неудобно
Сообщение Добавлено: Ср мар 04, 2009 20:19
  Заголовок сообщения:   Ответить с цитатой
Варнак писал(а):
Из вопросов студентам "на засыпку" :) :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

она спросит:

"2 ?
Сообщение Добавлено: Вт мар 03, 2009 21:20
  Заголовок сообщения:   Ответить с цитатой
Варнак писал(а):
Из вопросов студентам "на засыпку" :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?

Правильный ответ: :D
1. 10 (при любом BASE > 0x2)
2. Exception #-2003
2 BASE ! BASE @ . 2
^ -2003 WORD OR FILE NOT FOUND
(если BASE уже была 0x2)
Сообщение Добавлено: Вт мар 03, 2009 13:10
  Заголовок сообщения:   Ответить с цитатой
Из вопросов студентам "на засыпку" :) :
Что выдаст форт система в ответ на ввод следующей строки:
"2 BASE ! BASE @ ."?
Сообщение Добавлено: Вт мар 03, 2009 09:53
  Заголовок сообщения:   Ответить с цитатой
Вот и наступил он, Волшебный Миг Расплаты! Проблема шестого сапога пятой ноги загнана в угол!

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


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

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

Плюс в режиме интерпретации, в строке состояния консоли выводится текущее значение BASE наравне с вершинами стеков и состоянием переменной STATE.
Какие проблемы - не понимаю!
Сообщение Добавлено: Вт мар 03, 2009 07:39
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
практически все в форте встречались с проблемой неверного определения текущей системы исчисления,

А некоторые - и с неправильным написанием термина "система счисления"...
Сообщение Добавлено: Пн мар 02, 2009 21:43
  Заголовок сообщения:   Ответить с цитатой
Я бы предпочёл в стандарте аналог
int printf ( const char *format [, argument, ...]);

и
int sscanf (const char *buffer, const char *format [, address, ...]);
Сообщение Добавлено: Пн мар 02, 2009 20:49
  Заголовок сообщения:  о переменной 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:39

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


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