Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт окт 23, 2018 03:07

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: немного о ленивых вычислениях
СообщениеДобавлено: Чт ноя 12, 2009 19:05 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
собственно пример:
<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>

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


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

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
mOleg писал(а):
что не очень удобно уже хотя бы WARNING-ами.

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
оба многопоточные.
одинаковые имена как бы и не обязательны, просто так легче выдумывать имена 8)

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
и еще один вариант использования ленивости:
<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. "Ленивое" имя будет после исполнения больше недоступно для поиска.

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

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


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

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
mOleg
Ну непонимаю зачем такое SEE? :shuffle;


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
_Harry писал(а):
mOleg
Ну непонимаю зачем такое SEE?

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

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


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

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
А дошло!
Т.е. можно всякие отладочные дела так определять
и они будут компилироваться при первом обращении к ним.
Надо будет попробовать.


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

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


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

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


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

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