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

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

Обзор темы - кольцевые именованные стеки
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
WingLion писал(а):
т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?

ага :)
но есть альтернативный вариант без затирания (он закоментирован)
Сообщение Добавлено: Вт янв 13, 2009 22:17
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
FROM circle

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


т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?
Сообщение Добавлено: Вт янв 13, 2009 22:14
  Заголовок сообщения:   Ответить с цитатой
_Harry писал(а):
Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция

ну, к примеру для хранения истории последних введенных строк, или открытых файлов (понятно, что стек будет хранить ссылки на имена),
для работы, к примеру, генераторов случайных чисел, где они де факто используются, и вообще везде, где надо хранить некоторую историю действий.
Сообщение Добавлено: Вт янв 13, 2009 22:05
  Заголовок сообщения:   Ответить с цитатой
_Harry писал(а):
Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция :roll:

А зачем такая конструкция понадобилась авторам сопроцессора? Это полезная идея
Сообщение Добавлено: Вт янв 13, 2009 22:01
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
да можно, но зачем? (собственно раскоментировать одну строку и закоментировать другую надо(всего)

Ой, как же это так и не заметил :)
Сообщение Добавлено: Вт янв 13, 2009 22:00
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
А как сделать .S для такого стека?

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

SWIRL> circle DUMP

;) как пример покатит?
Сообщение Добавлено: Вт янв 13, 2009 21:53
  Заголовок сообщения:   Ответить с цитатой
Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция :roll:
Сообщение Добавлено: Вт янв 13, 2009 21:52
  Заголовок сообщения:   Ответить с цитатой
VoidVolker писал(а):
mOleg писал(а):FROM circle

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

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

да можно, но зачем? (собственно раскоментировать одну строку и закоментировать другую надо(всего) вот тут:
<pre>
\ извлечь последнее значение со стека
: (swirl>) ( --> n )
0 R@ @ 1 + CELLS R@ + CHANGE \ если надо удалять значение
\ R@ @ 1 + CELLS R@ + @ \ если значение не надо удалять
</pre>
;)
Сообщение Добавлено: Вт янв 13, 2009 21:52
  Заголовок сообщения:   Ответить с цитатой
А как сделать .S для такого стека? :D
Сообщение Добавлено: Вт янв 13, 2009 21:49
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
FROM circle
но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.

Так а может сделать так же как и в СиФорте - просто извлечение без обнуления?
Сообщение Добавлено: Вт янв 13, 2009 21:47
  Заголовок сообщения:  кольцевые именованные стеки  Ответить с цитатой
вот такая хохма родилась в 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 вместе с системой.
Сообщение Добавлено: Вт янв 13, 2009 21:34

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


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