Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 17:32

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: кольцевые именованные стеки
СообщениеДобавлено: Вт янв 13, 2009 21:34 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вот такая хохма родилась в 3 часа утра. Хохма заключается в том, как используются слов TO и FROM :)

\ 2009-01-13 ~mOleg
\ Сopyright [C] 2008 mOleg mininoleg@yahoo.com
\ кольцевые именованные стеки

util/ fld.fts
branch/ -if.fts

\ прочесть последнее положенное значение
: (swirl@) ( --> n ) R> 14 + DUP @ 1 + CELLS + @ ;

\ добавить новое значение в стек
: (>swirl) ( n --> )
R@ 5 + @ 1 + R@ 9 - @ MOD
DUP R@ 5 + ! CELLS R> 9 + + ! ;

\ извлечь последнее значение со стека
: (swirl>) ( --> n )
0 R@ @ 1 + CELLS R@ + CHANGE \ если надо удалять значение
\ R@ @ 1 + CELLS R@ + @ \ если значение не надо удалять
R@ @ 1 - -IF DROP R@ 14 - @ 1 - THEN R> ! ;

\ создать циклический стек с именем name и глубиной в # CELLS
: SWIRL ( # / name --> )
NEXT-WORD SHEADER
COMPILE (swirl@)
DUP HERE 0 A, ! \ формально должен быть адрес, а хранится длина
COMPILE (>swirl)
COMPILE (swirl>)
1 + CELLS ALLOT ;

\ вернуть адрес начала массива и его длину в байтах
: SWIRL> ( / name --> addr # )
' DUP 23 + SWAP CFL + @ CELLS [COMPILE] DLITERAL
; IMMEDIATE


Для тех случаев, когда необходимо помнить список последних событий можно использовать завернутый в кольцо стек. Переполнения такого стека не происходит, а происходит "заворачивание" указателя. Если количество значений, которые затолкнулив стек, превышает его глубину - новые значения начинают записываться поверх старых.

Стек создается так:

10 SWIRL circle \ создали стек на 10 ячеек

при простом упоминании имени, то есть в нашем случае circle будет возвращено последнее записанное в этот стек значение. Если есть необходимость поместить новое значение:

1 TO circle

поместит 1 на вершину стека circle

При необходимости извлечь значение надо делать:

FROM circle

но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.

Для получения прямого доступа к содержимому массива использовать

SWIRL> circle

что вернет адрес начала списка и его длину в байтах, а это значит, что можно делать так:

.. SWIRL> circle ERASE ..

для обнуления всех значений в стеке.

внимание, память под стек выделяется в статической области программы, это значит, что создавать такие стеки можно только небольшой глубины, кроме того, значения будут доступны в любом потоке процесса!! И еще, данные будут сохраняться по SAVE вместе с системой.

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


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
mOleg писал(а):
FROM circle
но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.

Так а может сделать так же как и в СиФорте - просто извлечение без обнуления?

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
А как сделать .S для такого стека? :D

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
VoidVolker писал(а):
mOleg писал(а):FROM circle

но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.

Так а может сделать так же как и в СиФорте - просто извлечение без обнуления?

да можно, но зачем? (собственно раскоментировать одну строку и закоментировать другую надо(всего) вот тут:
<pre>
\ извлечь последнее значение со стека
: (swirl>) ( --> n )
0 R@ @ 1 + CELLS R@ + CHANGE \ если надо удалять значение
\ R@ @ 1 + CELLS R@ + @ \ если значение не надо удалять
</pre>
;)

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


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

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция :roll:


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
А как сделать .S для такого стека?

дык, проще простого:

SWIRL> circle DUMP

;) как пример покатит?

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


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
mOleg писал(а):
да можно, но зачем? (собственно раскоментировать одну строку и закоментировать другую надо(всего)

Ой, как же это так и не заметил :)

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
_Harry писал(а):
Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция :roll:

А зачем такая конструкция понадобилась авторам сопроцессора? Это полезная идея

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
_Harry писал(а):
Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция

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

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


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

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

но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.


т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
WingLion писал(а):
т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?

ага :)
но есть альтернативный вариант без затирания (он закоментирован)

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


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

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


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

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


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

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