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 ] |
Заголовок сообщения: | |
оба многопоточные. одинаковые имена как бы и не обязательны, просто так легче выдумывать имена |
Автор: | 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? |
Автор: | 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/ |