Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
WingLion писал(а): т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?
ага
но есть альтернативный вариант без затирания (он закоментирован)
[quote="WingLion"]т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?[/quote]
ага :)
но есть альтернативный вариант без затирания (он закоментирован)
|
|
|
|
Добавлено: Вт янв 13, 2009 22:17 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): FROM circle
но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.
т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?
[quote="mOleg"]FROM circle
но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно. [/quote]
т.е. забрав значение слово FROM затирает нулем то место, где оно лежало?
|
|
|
|
Добавлено: Вт янв 13, 2009 22:14 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
_Harry писал(а): Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция
ну, к примеру для хранения истории последних введенных строк, или открытых файлов (понятно, что стек будет хранить ссылки на имена),
для работы, к примеру, генераторов случайных чисел, где они де факто используются, и вообще везде, где надо хранить некоторую историю действий.
[quote="_Harry"]Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция[/quote]
ну, к примеру для хранения истории последних введенных строк, или открытых файлов (понятно, что стек будет хранить ссылки на имена),
для работы, к примеру, генераторов случайных чисел, где они де факто используются, и вообще везде, где надо хранить некоторую историю действий.
|
|
|
|
Добавлено: Вт янв 13, 2009 22:05 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
_Harry писал(а): Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция
А зачем такая конструкция понадобилась авторам сопроцессора? Это полезная идея
[quote="_Harry"]Извиняюсь за глупый вопрос, а зачем может понадобиться такая конструкция :roll:[/quote]
А зачем такая конструкция понадобилась авторам сопроцессора? Это полезная идея
|
|
|
|
Добавлено: Вт янв 13, 2009 22:01 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): да можно, но зачем? (собственно раскоментировать одну строку и закоментировать другую надо(всего)
Ой, как же это так и не заметил
[quote="mOleg"]да можно, но зачем? (собственно раскоментировать одну строку и закоментировать другую надо(всего)[/quote]
Ой, как же это так и не заметил :)
|
|
|
|
Добавлено: Вт янв 13, 2009 22:00 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
вопрос писал(а): А как сделать .S для такого стека?
дык, проще простого:
SWIRL> circle DUMP
как пример покатит?
[quote="вопрос"]А как сделать .S для такого стека?[/quote]
дык, проще простого:
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>
[quote="VoidVolker"]mOleg писал(а):FROM circle
но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.
Так а может сделать так же как и в СиФорте - просто извлечение без обнуления?[/quote]
да можно, но зачем? (собственно раскоментировать одну строку и закоментировать другую надо(всего) вот тут:
<pre>
\ извлечь последнее значение со стека
: (swirl>) ( --> n )
0 R@ @ 1 + CELLS R@ + CHANGE \ если надо удалять значение
\ R@ @ 1 + CELLS R@ + @ \ если значение не надо удалять
</pre>
;)
|
|
|
|
Добавлено: Вт янв 13, 2009 21:52 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А как сделать .S для такого стека?
А как сделать .S для такого стека? :D
|
|
|
|
Добавлено: Вт янв 13, 2009 21:49 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): FROM circle но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.
Так а может сделать так же как и в СиФорте - просто извлечение без обнуления?
[quote="mOleg"]FROM circle но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.[/quote]
Так а может сделать так же как и в СиФорте - просто извлечение без обнуления?
|
|
|
|
Добавлено: Вт янв 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 вместе с системой.
вот такая хохма родилась в 3 часа утра. Хохма заключается в том, как используются слов TO и FROM :)
[pre]\ 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[/pre]
Для тех случаев, когда необходимо помнить список последних событий можно использовать завернутый в кольцо стек. Переполнения такого стека не происходит, а происходит "заворачивание" указателя. Если количество значений, которые затолкнулив стек, превышает его глубину - новые значения начинают записываться поверх старых.
Стек создается так:
10 SWIRL circle \ создали стек на 10 ячеек
при простом упоминании имени, то есть в нашем случае circle будет возвращено последнее записанное в этот стек значение. Если есть необходимость поместить новое значение:
1 TO circle
поместит 1 на вершину стека circle
При необходимости извлечь значение надо делать:
FROM circle
но надо учитывать, что извлечение значения удаляет его из стека, а это значит, что после извлечения всех значений из стека там останутся только нули!!! То есть выгребать значения по кругу нельзя, а заталкивать можно.
Для получения прямого доступа к содержимому массива использовать
SWIRL> circle
что вернет адрес начала списка и его длину в байтах, а это значит, что можно делать так:
.. SWIRL> circle ERASE ..
для обнуления всех значений в стеке.
внимание, память под стек выделяется в статической области программы, это значит, что создавать такие стеки можно только небольшой глубины, кроме того, значения будут доступны в любом потоке процесса!! И еще, данные будут сохраняться по SAVE вместе с системой.
|
|
|
|
Добавлено: Вт янв 13, 2009 21:34 |
|
|
|
|