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

обсуждение src4-mc10-b562@24.04.2011
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2752
Страница 2 из 4

Автор:  mOleg [ Пн авг 15, 2011 20:41 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

_Harry писал(а):
mOleg писал(а):
да, недодумано малость, но исправимо, собственно я уже понял, что придется создать словарь-прототип (или как его назвать), который будет оказываться в CURRENT при попытке изменит CURRENT на недопустимый вариант. Другой вариант, класть туда, к примеру FORTH и делать исключение, но лучше ли это?
Ни в коем случае так делать нельзя. Такая автоматика будет источником опасных и трудно определяемых ошибок.

ну, вот, смотри, есть такая ситуация:
в контексте следующие словари: ROOT NUMBERS FORT NUMBERS SOMEVOC
то есть на верху словарь, в который мы что-то добавляем, а под ним словарь, в который нельзя направлять компиляцию.
Обычно, когда словарь становится ненужным, я делаю RECENT - слово делает предыдущий словарь текущим, т.е. выполняет последовательность PREVIOUS DEFINITIONS - просто и удобно, но вызовет ошибку, что неприятно. Ну не всегда хочется думать, какой словарь под верхним (а иногда это вообще не возможно). если есть словарь пустышка, с именем, скажем, NULL , можно его сделать текущим. Ошибка от нас никуда не денется, если, конечно, попытаемся что-то добавить в NULL, но повторный RECENT ситуацию выправит. (проблема не надуманная, уже наталкивался на сию неприятность).

_Harry писал(а):
Какой словарь будет текущим должен определять программист.

да, но стабильность системы тоже важна.

_Harry писал(а):
Такой вариант вынудит программиста исправить свою ошибку. Чем это хуже .

дык и другой вынудит исправить, только ошибка будет "звучать несколько иначе"
вот набросок:
 vocs/ vocab.fts

ALSO HIDDEN DEFINITIONS

:> 'allot ( ? --> ) ERROR" В данном словаре нельзя резервировать память!" ;
:> 'header ( ? --> ) ERROR" В данном словаре нельзя создавать словарные статьи!" ;
:> 'conclude ( ? --> ) ERROR" В данном словаре нет незавершонных словарных статей!" ;
:> 'attr ( ? --> ) ERROR" В данном словаре нет определений!" ;
:> 'link ( ? --> ) ERROR" Нельзя!" ;
:> 'dp ( ? --> ) ERROR" Не имеет адресного пространства!" ;
:> 'latest ( vid --> ) DROP FALSE ;
:> 'xmount ( vid --> ) DROP ;
:> 'quest ( asc # vid --> 0 | lfa ) TDROP FALSE ;

ALSO ROOT DEFINITIONS \ NULL определим в ROOT

\ создание словаря пустышки
init: VOCABULARY
VOC-LIST A@ >L
&vinit L@ off_vflags B!
'xmount L@ off_umount A!
'xmount L@ off_mount A!
'quest L@ off_quest A!
0 L@ off_temp A!
'attr L@ off_get-attr A!
'link L@ off_linkvoc A!
'latest L@ off_latest A!
1 L@ off_threads# B!
voc-table DUP L>

off_vtable A! >L
'dp L@ off_vdp A!
'allot L@ off_allot A!
'header L@ off_header A!
'conclude L@ off_conclude A!
'attr L@ off_set-attr A!
LDROP
;stop NULL

\ проверка можно ли делать словарь текущим
\ если нет vtable а так же если нет метода allot!
:> 'check-voc ( vid --> vid )
DUP off_vtable A@
*IF off_allot A@ IF ;THEN THEN DDROP
WHO NULL ;

'check-voc IS check-voc

RECENT RECENT

\


_Harry писал(а):
Кстати некорректность работы со словарем по vid это опять же на совести того кто так работает можно ведь и вполне корректно написать

Да можно, но часто лень 8) сам нарывался на такое.

_Harry писал(а):
Учти что все мои рассуждения относятся к словарям в HEAP для которых уже определен метод off_umount вот именно он мне не понравился.

да понятно, но решение требуется сразу для нескольких проблем, в первую очередь, например, есть у нас в контексте такая бяка:
ROOT FORTH WORK NUMBERS WORK
и WORK так же является текущим
и тут я делаю ему UMOUNT
и по-идее должно получиться:
ROOT FORTH NUMBERS
а вот в текущем словаре что должно оказаться?
WORK уже там быть не может!
NUMBERS так же быть там не может!
что делать-то?

Автор:  _Harry [ Пн авг 15, 2011 23:21 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

mOleg писал(а):
что делать-то?
Ну смешной вопрос :) ...сообщить об ошибке :wink:

Автор:  dynamic-wind [ Вт авг 16, 2011 00:17 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

Запретить удаление словаря, если он в стеке контекста, что ещё.
Стек контекста изменяют только операции втолкнуть/вытолкнуть.
То же самое с CURRENT.
Вот это логично.

Для "вычистки" всех ссылок на словарь (с заменой на что-то) можно придумать отдельное слово.

Автор:  mOleg [ Вт авг 16, 2011 15:13 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

_Harry писал(а):
mOleg писал(а):
что делать-то?
Ну смешной вопрос ...сообщить об ошибке

а мне он не кажется смешным,
Имхо, словарь должен отмонтироваться в любом случае, даже, если он является текущим (или только текущим), хотя это тянет за собой другие проблемы, например, может быть не завершено создание определения (а это точно должна быть ошибка).
Приведу такой пример, под виндой перед извлечением флешки необходимо ее отмонтировать, и часто так бывает, что это не выходит (кто-то ее заблокировал), и необходимо сделать достаточно много действий, чтобы извлечь ее корректно. Я в подавляющем большинстве случаев плюю на корректность, так как обычно важна скорость. А Форт кроме всего прочего все же ближе к системам реального времени 8)

dynamic-wind писал(а):
Запретить удаление словаря, если он в стеке контекста, что ещё.

нет, как раз он должен оттуда удаляться, проблема не с контекстом а с CURRENT

dynamic-wind писал(а):
Стек контекста изменяют только операции втолкнуть/вытолкнуть.

не только, собственно базовыми операциями являются GET-ORDER и SET-ORDER

dynamic-wind писал(а):
Для "вычистки" всех ссылок на словарь (с заменой на что-то) можно придумать отдельное слово.

не проблема:
\ удалить все ссылки из контекста на указанный словарь,
\ если словарь не является текущим
: RMVID ( vid --> )
GET-CURRENT OVER = ABORT" Сначала убери словарь из CURRENT!"
>R
0 GET-ORDER >L
BEGIN *WHILE
DUP R@ = IF DROP -1 L+ ELSE L> D>L THEN
REPEAT DROP RDROP
L> DUP >R BEGIN *WHILE 1 - L> SWAP REPEAT DROP R>
SET-ORDER ;

Автор:  Hishnik [ Вт авг 16, 2011 15:35 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

mOleg писал(а):
Приведу такой пример, под виндой перед извлечением флешки необходимо ее отмонтировать, и часто так бывает, что это не выходит (кто-то ее заблокировал), и необходимо сделать достаточно много действий, чтобы извлечь ее корректно.

Вот тут можно поподробнее? С флешкой ясно - там есть длительный цикл физической записи в микросхему, поэтому передача данных, которая с точки зрения прикладной программы завершена, может еще физически не осуществиться. А что со словарями происходит такого, что их надо отмонтировать? К примеру, длительная переиндексация в параллельном потоке, без завершения которой содержимое словаря нельзя считать действительной?

Автор:  mOleg [ Вт авг 16, 2011 16:47 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

Хищник писал(а):
Вот тут можно поподробнее?
....
А что со словарями происходит такого, что их надо отмонтировать?
К примеру, длительная переиндексация в параллельном потоке, без завершения которой содержимое словаря нельзя считать действительной?

Тут для начала надо отметить, что словарь может отражать каталог, в том числе и флешку.
Собственно словарь в форке может содержать произвольные данные.

Автор:  dynamic-wind [ Вт авг 16, 2011 17:17 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

mOleg, может быть такое, что текущий поток не знает, кто и когда удаляет его текущий словарь?
По идее, такого нельзя допускать, логика работы потока нарушится.
Еще вариант: послать потоку асинхронный сигнал СЛОВАРЬ-КИРДЫК. Пусть он сам решает, на что заменить CURRENT. Или умирает.

Автор:  mOleg [ Вт авг 16, 2011 18:27 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

dynamic-wind писал(а):
mOleg, может быть такое, что текущий поток не знает, кто и когда удаляет его текущий словарь?

эхм, все не так.
Вы пишете код, т.е. добавляете определения в текущий (CURRENT) словарь, и у вас есть некий контекст (CONTEXT) где ищутся уже существующие имена, для примера можно взять такое состояние:

CONTEXT: ROOT NUMBERS FORTH PROJECT
CURRENT: PROJECT

т.е. в контексте находится 4 словаря, то есть там, где ищутся определения,
и новые слова добавляются в PROJECT
Да, забыл оговориться, что и текущий словарь и контекст локальны для каждого потока! т.е. не взаимодействуют.
Что понимается под демонтированием словаря? А то, что система больше его не хочет использовать! К примеру, у вас есть динамический словарь, в который вы "сбрасывали" некие промежуточные данные в виде определений, ну, например ассемблер. После того, как вы использовали ассемблер и он стал вам не нужен закономерно желание от него избавиться и освободить память. В таком случае и будет делаться UMOUNT .
Но что делать, если у вас ассемблер упоминается несколько раз, более того в последнее время вы что-то добавляли в этот словарь (но оно уже не нужно!)? Можно, конечно, сделать текущим какой-то любой словарь, к примеру FORTH, даже, если вы не собираетесь туда что либо добавлять, а потом выполнить демонтаж словаря, т.е. освободить занимаемую им память. Кстати, еще один важный момент, никаких ссылок на удаляемый словарь из системы быть не должно.
вобщем как-то так 8)

да, вернемся к нашему PROJECT словарю. В определенный момент нам он перестает быть нужным, и хочется его убрать из контекста и перенаправить компиляцию в другой словарь, в форке это делается с помощью слова RECENT , после его выполнения в контексте останется:
ROOT NUMBERS FORTH
а текущим словарем станет FORTH
все удобно и просто, но, бывает, что вместо FORTH - то есть такого словаря, в который можно добавлять определения под нашим PROJECT лежит словарь, который нельзя делать текущим, причем это не всегда можно предсказать, то есть после законного RECENT выпадает ошибка "словарь нельзя делать текущим" - вобщем неудобно.

Автор:  вопрос [ Вт авг 16, 2011 19:25 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

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

Автор:  dynamic-wind [ Вт авг 16, 2011 19:59 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

mOleg писал(а):
все удобно и просто, но, бывает, что вместо FORTH - то есть такого словаря, в который можно добавлять определения под нашим PROJECT лежит словарь, который нельзя делать текущим, причем это не всегда можно предсказать, то есть после законного RECENT выпадает ошибка "словарь нельзя делать текущим" - вобщем неудобно.

Ага, врубился. :^) Логика RECENT очень уж простая, в 90% годится, а дальше проблемы.
Пора CURRENT превратить в стек, как сделано с CONTEXTом :idea:

Автор:  mOleg [ Вт авг 16, 2011 20:11 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

dynamic-wind писал(а):
Пора CURRENT превратить в стек

гы, уже думалось, не, не катит, будет слишком сложно для восприятия и контроля. А вот положить словарь пустышку в самый раз: если возникнет желание в него что-нибудь скомпилировать, выскочит ошибка (т.е. контроль остается), если же будет пара идущих подряд RECENT , ошибки не будет, поведение предсказуемо, короче все путем 8) плюс, возможность безболезненно делать umount.

вопрос писал(а):
мне кажется, сложность обращения со словарями уже превосходит сложность ооп для прграммиста - там, по крайней мере, достаточно выучить синтаксис и помнить свой замысел

ню-ню, вы, наверное, в своем компе все складываете в один (корневой каталог), так ведь проще, каталоги (папки) ужасно сложная для понимания вещь - то ли дело ООП.

Автор:  вопрос [ Вт авг 16, 2011 20:18 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

mOleg писал(а):
вы, наверное, в своем компе все складываете в один

нет, разумеется.

Автор:  _Harry [ Вт авг 16, 2011 20:44 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

mOleg писал(а):
"словарь нельзя делать текущим" - вобщем неудобно

Очень неудобно когда ничего не выпадает а ошибка остается. Я уже говорил тебе касательно юнитов что нужно конролировать контекст вот из за твоего любимого RECENT как раз и получаются ошибки которые достаточно трудно обнаруживать так как они проявляются совсем в других местах. Я ни как не пойму чем тебя неустраивает мгновенная реакция на ошибку. Зачем так усложнять все.

Автор:  Hishnik [ Вт авг 16, 2011 23:30 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

mOleg писал(а):
Собственно словарь в форке может содержать произвольные данные.

Ага... содержать может, а навороты с размонтированием уже сейчас :)

Автор:  вопрос [ Ср авг 17, 2011 10:41 ]
Заголовок сообщения:  Re: обсуждение src4-mc10-b562@24.04.2011

_Harry писал(а):
из за твоего любимого RECENT как раз и получаются ошибки которые достаточно трудно обнаруживать
это "получившееся" или "удавшееся" обобщение - новый конструкт языка, если пройдёт проверку практикой, станет "плодотворным"
или потребуется другая идея.

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