Forth
http://fforum.winglion.ru/

Борьба со словарями!
http://fforum.winglion.ru/viewtopic.php?f=2&t=2639
Страница 4 из 4

Автор:  chess [ Сб авг 28, 2010 10:07 ]
Заголовок сообщения:  Re: Борьба со словарями!

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

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

Автор:  вопрос [ Сб авг 28, 2010 16:19 ]
Заголовок сообщения:  Re: Борьба со словарями!

Вообще, любая структура (любой способ организации чего-то) осуществляется в соответствии с некоторым принципом, который находят исходя из некоторой цели (и целесообразности)
Бессмысленно спорить, не исходя из цели ИМХО

Автор:  Hishnik [ Сб авг 28, 2010 18:23 ]
Заголовок сообщения:  Re: Борьба со словарями!

chess писал(а):
Я против реализаций контекста, использование которых основаны на задействовании внимания программиста.

+1. Программист не развлекается с языком, а использует его для решения какой-то задачи.

Автор:  mOleg [ Сб авг 28, 2010 18:26 ]
Заголовок сообщения:  Re: Борьба со словарями!

chess писал(а):
Если вы сделали вывод, что я против контекста вообще - то вы ошиблись. Я против реализаций контекста, использование которых основаны на задействовании внимания программиста.Во многих языках программирования, и в естественных языках кстати, контекст опирается надолговременную память а не на кратковременную. В этом их принципиальное отличие от фортас его словарями.

Тогда я вообще не вижу причин разведения этого, ээ, обсуждения.
Наличие контекста в любом современном форте не заставляет никого его использовать.
Вы можете как создать свой рабочий словарь и с ним работать, так и располагать все в словаре FORTH.
Если очень мешает, то можно вообще исправить исходник форта и пересобрать с одним единственным словарем, или вообще без словарей.

Автор:  _Harry [ Вс авг 29, 2010 11:24 ]
Заголовок сообщения:  Re: Борьба со словарями!

mOleg писал(а):
Тогда я вообще не вижу причин разведения этого, ээ, обсуждения.

Так ведь тема то какая "борьба со словарями"
Есть ведь мнение что надо с ними бороться :))
Представляю себе на форуме автомобилистов кто нибудь предложил бы бороться с рулем например.
Кстати автор темы давно молчит интересно реализовал он свои идеи?
Интересно бы и на код взглянуть. Как раз это и есть самое ценное (вернее этого пока нет :roll: )

Автор:  Antender [ Вс авг 29, 2010 12:38 ]
Заголовок сообщения:  Re: Борьба со словарями!

Последняя редакция: 30.07.2010 14:25
Код:
[PRE]
\ Библиотека для работы с древовидными словарями.
\ Позволяет присоединять компилируемые слова к любой части дерева.
\ Для создания новой ветви дерева компилируйте присоединяемое слово при помощи :
\ и ;BR "слово-присоединение" .
\ Все последующие слова можно добавлять через : и ; .
\ Заканчивается создание ветви словом BREND
\ Нисходящий поиск по дереву начинается со слова, NFA которого занесено в переменную (TREEFIND).

\ ----------Переменные-------------------------------------------------
VARIABLE (TREEFIND) \ NFA слова с которого начинается нисходящий поиск по дереву

\ ----------Внутренние слова реализации--------------------------------
: BR ( NFA xt -- ) \ изменить LFA слова c NFA на xt ( для отделения ветви )
NEAR_NFA DROP SWAP NAME>L ! ;

\ ----------Слова доступные для использования--------------------------
: BRCH ( "name1" "name2" ) \ изменить LFA "name1" на NFA "name2"
' NEAR_NFA DROP ' BR ;
: ;BR ( "name" -- ) \ закончить компиляцию новой ветви
POSTPONE ; ' LATEST BR ; IMMEDIATE
: BRLAST  \ делает ветку видимой для поиска
LATEST (TREEFIND) ! ;
: BRSW ( "name" -- ) \ заменяет начальное слово для поиска на "name"
' NEAR_NFA DROP (TREEFIND) ! ;
: BR0 ( "name" )
0 ' NEAR_NFA DROP NAME>L ! ;

\ ----------Внутренние слова реализации---------------------------------
: TREEFIND ( addr u -- 0 | xt 1 | xt -1 ) \ заменяет стандартный FIND
(TREEFIND) @
BEGIN
?DUP
IF >R 2DUP R@ COUNT COMPARE R> SWAP
    IF CDR FALSE
    ELSE NIP NIP DUP NAME> ?IMMEDIATE IF 1 ELSE -1 THEN TRUE
    THEN
ELSE
    DROP DROP 0 TRUE
THEN
UNTIL ;
[/PRE]

Автор:  _Harry [ Пн авг 30, 2010 10:03 ]
Заголовок сообщения:  Re: Борьба со словарями!

Antender писал(а):
Уже есть! Как раз написал.

Хм замечательно, только.... :roll:
Желательно и пример использования изобретения.
Показывающий приимущество данного метода, а... :?:

Автор:  Antender [ Пн авг 30, 2010 14:19 ]
Заголовок сообщения:  Re: Борьба со словарями!

ВНИМАНИЕ! Библиотека периодически обновляется.
В начале будет указываться дата последнего изменения.

То, что не работает:
Замена основного поиска - т.к. вектор FIND системой не используется, а SFIND, увы, не заменишь.

Слова для использования:
1 : , ; ,;BR

Слова в словаре ---->
В 1 A--------------------------B---C----D
е 2 +--A1---B1---C1
т 3 +-------------A2---B2
в
и
|
|
|
v


с точки зрения обычного словаря
A--A1--B1--C1 A2--B2 B--C--D
Как реализовать такое дерево?

1 Отпочковываем дополнительную ветвь начинающуюся с A1 и приделанную к А
( стандартно ) : A1 DUP SWAP DROP ( затем нестандартное закрытие ) ;BR ( затем точка привязки ) A
2 добавляем следующие определения в словарь
: B1 DUP SWAP DROP ;
: C1 DUP SWAP DROP ;
3 добавляем новую ветку
: A2 DUP SWAP DROP ;BR A1
4 добавляем следующее определение
: B2 DUP SWAP DROP ;
(4 опционально)
BRLAST ( для того, чтобы при вызове TREEFIND не прекращал сразу поиск в связи с 0 адресом, начинал цепочку B2--A2--A1--A--- и.т.д)
5 продлеваем основную цепочку
: B DUP SWAP DROP ;BR A
6 в дальнейшем добавление слов происходит как обычно

2 BRLAST , BRSW ( "name -- )

Т.к. основной поиск всегда происходит с последнего созданного слова, то в данном случае выглядеть он будет D--C--B--A , остальные ветки для него скрыты

TREEFIND'ом можно управлять двумя способами:

BRLAST - во время создания, воткнуть после создания слова, с которого начинается поиск

BRSW - после создания структуры дерева, указать слово после BRSW, с которого начинается поиск

Поиск начинается именно со слова NFA которого в TREEFIND - слова приписанные после него НЕ ПРОСМАТРИВАЮТСЯ. Т.е. можно определять не только ветку для поиска но и положение в ней.

3 BRCH ( "name1" "name2" )

BRCH - меняет привязку слова на ходу, позволяя соединять вместе, разрезать на две, удалять ( в отличие от словарей! ) ветви

"name1" - слово которому меняем привязку

"name2" - слово - новая привязка

Например:

BRCH A2 C1

поменяет привязку A2, ветки сольются, дерево станет таким

Слова в словаре ---->
В 1 A--------------------------B---C----D
е 2 +--A1---B1---C1
т +--A2---B2
в
и
|
|
|
v


точнее таким

Слова в словаре ---->
В 1 A------------------------B---C---D
е 2 +--A1--B1--C1--A2--B2
т
в
и
|
|
|
v


4 BR0 ( "name" -- )

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

Пример:

Берём дерево выше и обнуляем A1

BR0 A1

получаем
Слова в словаре ---->
В 1 A------------------------B---C---D
е 2 A1--B1--C1--A2--B2
т
в
и
|
|
|
v

отгороженный список с A1, при TREEFIND'е начиная с В2 получится цепочка

В2--А2--С1--В1--А1 , на А1 поиск обрывается

5 TREEFIND ( addr u -- 0 | xt 1 | xt -1 )

TREEFIND - ищет по текущей ветви и вниз до 0, слово заданное addr и количеством символов u , возвращает 0, если не нашёл , xt и 1 если нашёл, и xt -1 - нашёл слово IMMEDIATE исполнения

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

Автор:  Antender [ Пн авг 30, 2010 14:34 ]
Заголовок сообщения:  Re: Борьба со словарями!

Библиотеку нужно вынести в отдельную тему "Библиотека по работе с древовидными словарями" в SPF , а старую стереть за ненадобностью.

Автор:  mOleg [ Пн авг 30, 2010 15:21 ]
Заголовок сообщения:  Re: Борьба со словарями!

стирать тему не стоит.
Новую тему можете открыть самостоятельно.

Единственное замечание - подумайте как вы собираетесь обеспечивать стабильную работу системы в рамках принятой в СПФ многопоточности (т.е. когда несколько потоков будет вести поиск в словарях).

Автор:  Antender [ Пн авг 30, 2010 15:34 ]
Заголовок сообщения:  Re: Борьба со словарями!

В данном случае поиску без разницы т.к. он очень похож на SEARCH-WORDLIST, кроме того после начала поиска уже всё равно какое значение имеет (TREEFIND)

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