Forth
http://www.fforum.winglion.ru/

немного о ленивых вычислениях
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2311
Страница 1 из 1

Автор:  mOleg [ Чт ноя 12, 2009 19:05 ]
Заголовок сообщения:  немного о ленивых вычислениях

собственно пример:
<pre>
0x200 CONSTANT temp-buff#

USER-VALUE temp-buff

\ вернуть адрес строки буфера
: temp-buff ( --> addr )
temp-buff *IF ;THEN DROP
temp-buff# ALLOCATE THROW
DUP TO temp-buff ;
</pre>

в предложенном выше решении вызов temp-buff всегда будет возвращать действительный адрес.
То есть место в хипе под хранение данных будет вызыватья только в момент первого вызова этого слова.
Однако, одно имя упоминается дважды, что не очень удобно уже хотя бы WARNING-ами.
соответственно, гораздо удачнее использовать конструкцию CREATE DOES> и "одним махом двоих побивахам".
<pre>
: HEAP-BUFF ( # / name --> )
CREATE , ADDR USER-PLACE , \ создать имя, выделить место в локальной области под хранение указателя
DOES> ( --> addr )
DUP CELL + @ TlsIndex@ + \ тут должен храниться адрес блока
A@ *IF NIP ;THEN DROP \ если место уже выделено, вернуть адрес
DUP @ ALLOCATE THROW \ выделить место для буфрера в Хипе
TUCK SWAP CELL + @ TlsIndex@ + A! ; \ сохранить полученный адрес, его же вернуть

0x200 HEAP-BUFF temp-buff \ а теперь можно создавать такие буфера пачками ;)
</pre>

Автор:  _Harry [ Чт ноя 12, 2009 19:38 ]
Заголовок сообщения: 

mOleg писал(а):
что не очень удобно уже хотя бы WARNING-ами.

А зачем давать два одинаковых имени?
Да второй вариант многопоточный я так понимаю...

Автор:  mOleg [ Чт ноя 12, 2009 19:43 ]
Заголовок сообщения: 

оба многопоточные.
одинаковые имена как бы и не обязательны, просто так легче выдумывать имена 8)

Автор:  mOleg [ Пт ноя 13, 2009 13:40 ]
Заголовок сообщения: 

и еще один вариант использования ленивости:
<pre>
\ 18.10.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ "ленивое" SEE

\ сделать имя указанного слова lfa недоступным для поиска
: forget ( lfa --> ) TRUE SWAP &SMG SET-ATTR THROW ;

\ LAZY определение ;)
: SEE ( / NAME --> )
s" .\\lib\\util\\see.fts" Requires \ подключить, если необходимо нужную библиотеку
[ LATEST LIT, ] forget \ сделать себя недоступным для поиска в следующий раз
[ LATEST ID>ASC SLIT, ] EVAL-TOKEN \ выполнить одноименное слово
;
</pre>

использовать обычным образом:
SEE NAME

Если библиотека уже подгружена, то просто будет вызвано слово SEE по имени. Если библиотека не подгружена, то сначала она будет подключена, а затем вызвано слово SEE. "Ленивое" имя будет после исполнения больше недоступно для поиска.

таким образом, я нашел несколько применений "ленивости" в Форте, какие еще варианты кто может предложить? ;)

Автор:  _Harry [ Пт ноя 13, 2009 18:13 ]
Заголовок сообщения: 

mOleg
Ну непонимаю зачем такое SEE? :shuffle;

Автор:  mOleg [ Пт ноя 13, 2009 18:21 ]
Заголовок сообщения: 

_Harry писал(а):
mOleg
Ну непонимаю зачем такое SEE?

дык, во-первых, это пример.
во-вторых, этот SEE не будет занимать места в ОЗУ до тех пор, пока он не понадобится, а это значит,
что:
1) быстрее будет запускаться система (не надо подключать лишние либы)
2) меньше будет мусора в словарях (так как слов меньше)
и вообще SEE будет собран только тогда, когда он понадобится.

Автор:  _Harry [ Пт ноя 13, 2009 18:41 ]
Заголовок сообщения: 

А дошло!
Т.е. можно всякие отладочные дела так определять
и они будут компилироваться при первом обращении к ним.
Надо будет попробовать.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/