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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 120 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб авг 29, 2015 21:36 
vikt писал(а):
Какие операции нужно совершить с этой последовательностью и какие данные
с нее нужно получить, что бы восстановить последовательность,
Это называется "коды, исправляющие ошибки". Есть даже библия этого дела - книжка Питерсона, так и называется.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб авг 29, 2015 23:47 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 1019
Благодарил (а): 3 раз.
Поблагодарили: 35 раз.
vikt писал(а):
Какие операции нужно совершить с этой последовательностью и какие данные
с нее нужно получить, что бы восстановить последовательность,

Общая классификация термина - "Избыточное кодирование" файлов.

P.S. Беглое гугление выдало ссылку на программу dvdisaster предполагаемой запросу функциональности.
Есть, наверное, и другие программы с открытым кодом



За это сообщение автора KPG поблагодарил: vikt
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Вс сен 20, 2015 20:52 
Вернемся к "хитростям"...

В одной из старых советских книг предлагались следующие способы сделать запросы к БД более лаконичными.

1) множество значений характеристик
должность == инженер, техник, завлаб,...;
фамилия == Иванов, Петров,...;
зарплата == 100-500;
год рождения == 1920-1985;
2) описание самоидентифицирующихся значений
красный -> цвет;
инженер, лаборант -> должность;
3) приписывание семантической ориентации
моложе == =<(возраст);
выше == =>(зарплата, рост, производительность);
снс == =зн(должность);
4) выделение определяющих атрибутов
инженер == сотрудник | должность = инженер;
комсомолец == сотрудник | партийность = ВЛКСМ;
5) указание специфицирующего набора характеристик
сотрудник == (фамилия, имя, отчество, должность);
подразделение == (название);
6) введение синонимов
зарплата == оклад;
сотрудник == кто;
7) определение словосочетаний
общие сведения == фамилия, имя, отчество, год-рождения, должность, группа;
8 ) описание значения атрибутов
научный сотрудник == снс/мнс/завниг;
темный == черный/синий/коричневый/фиолетовый.

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

А как быть с "самоидентифицирующимися значениями" т.е. с восстановлением предиката, по константе?

Чтобы "ЦВЕТ СИНИЙ" значило то же, что и "СИНИЙ", но, разумеется, оставалась возможность написать "ОТТЕНОК СИНИЙ".

Т.к. FORTH позволяет все, то, очевидно, возможны самые разные варианты.

Допустим, для определенности, предикаты записываются в виде ": ПРЕДИКАТ ВЫЧИСЛЯТОР ПРОВЕРЯТОР ;", где ВЫЧИСЛЯТОР получает текущее значение (поля БД), а ПРОВЕРЯТОР проверяет его соответствие условию.
Т.е. ЦВЕТ - ВЫЧИСЛЯТОР, а СИНИЙ - ПРОВЕРЯТОР.

(Возвращаясь к пунктам (1 и 3-8) видим, что их можно рассматривать как конструктор из ВЫЧИСЛЯТОРОВ и ПРОВЕРЯТОРОВ).

Очевидное решение пункта (2) - проверка словом СИНИЙ флага выполнения ВЫЧИСЛЯТОРА.
Или даже (используя нечеткую логику, раз уж речь идет о понимании естественного языка), поиск наиболее подходящего ВЫЧИСЛЯТОРА для данного ПРОВЕРЯТОРА.

Есть ли в FORTH более естестсвенные решения?
Как сообщить слову о том, что от него хотят что-то необычное?
Очевидно, используя словари.
ВЫЧИСЛЯТОР должен быть словарем.

Т.е. СИНИЙ, лежащий в словаре ЦВЕТ берет значение поля "цвет", а в словаре ОТТЕНОК - поля "оттенок". СИНИЙ, лежащий в корневом словаре, идентичен "цветному".
(Или наш словарь настолько умен, что позволяет перенести СИНИЙ из словаря ЦВЕТ в корневой, при обявлении его "самоидентифицирующимся").

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

Неприятность при таком подходе поджидает при наличии в предикате более одного ВЫЧИСЛЯТОРА.
Например, "ИМЯ1 ИМЯ2 ТЕЗКИ".

Т.е. надо иметь четыре словаря для "ИМЯ1 ИМЯ2 ТЕЗКИ", "ИМЯ1 ТЕЗКИ", "ИМЯ2 ТЕЗКИ" и "ТЕЗКИ" (2 в степени N для N ВЫЧИСЛЯТОРОВ, не считая варианта с перестановками - "ИМЯ2 ИМЯ1 ТЕЗКИ").
Т.е. в словаре ИМЯ1 должно быть слово ИМЯ2, тоже являющееся словарем.
Но, самое смешное, если мы готовы записывать в словари не имена, а лишь ссылки на них (и косвенный шитый код), это даже не вызовет особых накладных расходов.

Т.о. мы приходим к разделению словаря на отдельные части: стековую (код), строковую (имена) и списковую.
Это, например, может быть полезно в случае, когда набор операций (слов) некоторого подмножества машин фиксирован, но код этих слов различен.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Ср окт 28, 2015 19:42 
Еще одна маленькая хитрость. Рано или поздно начинается геморрой с организацией своей собственной строковой памяти. Вспомните того же Rodriquez. Но, ведь в FORTH такая память есть по умолчанию - это его словарь! Конечно, он хранит только константы без пробелов, но для подавляющего количества программ работы с данными этого вполне достаточно.
Слово создания таких строковых констант выглядит очень просто (в Win32Forth):

: SD ( <NAME> -- A) HERE CREATE >NAME DUP , DOES> ( -- A) @ ;

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

Т.е. создаются слова, возвращающие свое собственное имя.
Более того, если вы сами пишете свой FORTH, то написать CREATE" для создания слов с пробелами, переназначить ввод для изготовления слов-строк на лету и/или организовать через FORGET очистку строковой памяти - пара пустяков.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт окт 29, 2015 14:12 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
vikt писал(а):
Срочно помогите придумать хитрость.
Дана последовательность байт X0 X1 X2 ... XN
Какие операции нужно совершить с этой последовательностью и какие данные
с нее нужно получить, что бы восстановить последовательность,
  • Вроде решается использованием кода Рида-Соломона, сам не пробовал.
  • При использовании флоппи и СД теряется не отельный байт, а сектор. От 512 байтов.
  • WinRAR позволял добавлять к архиву "информацию для восстановления". Можно попробовать готовое решение.
  • Можно использовать облачные сервисы типа Dropbox или подборку. Записать туда файлы, возможно заархивированные (можно с паролем).
Это сообщение можно удалить по просьбе автора топика, я сам не могу... :(

_________________
With best wishes, in4.


Последний раз редактировалось in4 Чт окт 29, 2015 14:25, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт окт 29, 2015 14:20 
Прошу вынести из темы флуд про коды, исправляющие ошибки. Во-первых, проблема кодов сложная, во-вторых ссылку на первоисточник я дал.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт окт 29, 2015 16:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6636
Благодарил (а): 15 раз.
Поблагодарили: 106 раз.
gudleifr писал(а):
Т.е. создаются слова, возвращающие свое собственное имя.

Теперь вместо правки текста после MSG1 придется отлавливать все упоминания строковой константы в программе и менять ее на другую. И так каждый раз, если содержимое сообщения нужно будет изменить. "Зато Форт" :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт окт 29, 2015 17:09 
Hishnik писал(а):
Теперь вместо правки текста после MSG1
Это просто разные способы применения строк. То, что Вы упомянули, называется ."
На самом деле, был еще один способ, но умер по дурости фортеров - BLOCK.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт янв 14, 2016 14:02 
Фортеры очень любят связку

CREATE данные DOES> код

позволяющую создавать "замыкания" - имена для вызовов одной и той же ф-ии с разными параметрами. Но, мало кто пользуется тем, что кроме параметров-данных в эти слова можно вставлять и параметры-код.

CREATE данные ] DOES> код >R

Например, в игре, которую я сейчас переписываю для своей странички, есть, как и положено, жуткий набор правил: "если выполняются такие-то условия, то можно сыграть так-то". Причем два "условия" - "для данной версии правил" и "в этой фазе хода" повторяются постоянно. Что может быть проще, чем придумать особый вид слов - ПРАВИЛА? (Win32Forth).

VARIABLE ФАЗА
VARIABLE ВЕРСИЯ
: ПРАВИЛО ( <ИМЯ> ФАЗА, ВЕРСИЯ -- ...) CREATE , , ] DOES>
DUP @ ВЕРСИЯ @ AND IF CELL+ DUP @ ФАЗА @ = IF CELL+ >R
ELSE DROP THEN ELSE DROP THEN ;

Использование:

фаза версия ПРАВИЛО имя-правила код -правила ;

5 ФАЗА !
7 ВЕРСИЯ !

5 1 ПРАВИЛО EX1 55 . ;
6 1 ПРАВИЛО EX2 66 . ;
5 3 ПРАВИЛО EX3 77 . ;

EX1 EX2 EX3 ___55_77_Ok

P.S. В этом смысле >R очень часто удобнее EXECUTE , т.к. позволяет выполнить не одно слово, а целое предложение.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт янв 14, 2016 19:01 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 1019
Благодарил (а): 3 раз.
Поблагодарили: 35 раз.
Можно использовать множественный DOES>
Код:
: WEIRD CREATE DOES> DROP 1 . DOES> DROP 2 . ;
WEIRD TEST
TEST TEST TEST

или такой вариант
Код:
: WEIRD CREATE BEGIN DOES> DROP  1 . DOES> DROP 2  . AGAIN ;


P.S. Продемонстрировано в видео TurboForth


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Чт янв 14, 2016 20:03 
KPG писал(а):
Продемонстрировано в видео
Это трудно полезно использовать, т.к. DOES> изменяет код последнего слова. Попробуйте после WEIRD TEST вставить еще одно определение.

P.S. Правильно такое "самопереопределение" делать через DOER: http://www.gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=%5C6.PERWOISTOTNIKI%5CLEO%20BRODIE%20THINKING%20FORTH%5C11.PRILOSENIE%20B:%20OPREDELENIE%20DOER/MAKE (Там тоже используется ... ] ... >R )


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пн фев 08, 2016 13:46 
Используя введенные в прошлом совете "условно-исполняемые" слова, мы можем заметить, что определяемое слово совершенно не обязано выполнять подряд все прописанные в него слова.

Например, в той же игре, сама игра прописывается как набор частей:

: ИГРА BEGIN ФЛАГ WHILE КОМПАС МЕРКАТОР СУНДУК ПАРТИЯ КЛАБАУТЕРМАН REPEAT ;

И отсюда совсем не следует, что за МЕРКАТОРОМ обязательно следует СУНДУК. СУНДУК может "пропустить свою очередь". В зависимости от состояния (ФАЗЫ) игры чаще всего на каждом прогоне будет исполняться только одно из слов (плюс КОМПАС, который управляет переключением фаз).

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

Возвращаясь к Дейкстре (и развитии метода в языке ОККАМ), мы можем видеть варианты прошивки слов в код: seq, par, if, do... Причем, как группируя слова, так и группы слов (используя "скобки", вроде дейскстровских "->", "[]"). Но суть-то хитрости не в создании новых типов определяющих слов, а в том, что слово может само определять, что оно делает в данной ситуации. И делать это столь успешно, что порядок слов в определении может совершенно не соответствовать порядку их исполнения.

Т.е. возможно не только:

: СЛОЖНОЕ-ДЕЙСТВИЕ ДЕЙСТВИЕ1 ДЕЙСТВИЕ2 ... ДЕЙСТВИЕn ;

но и

: СЛОЖНЫЙ-ОБЪЕКТ ЛЕВАЯ-ЧАСТЬ ПРАВАЯ-ЧАСТЬ ... ЗАДНЯЯ-ЧАСТЬ ;


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Вс апр 10, 2016 16:51 
Еще один способ отложенного определения слов (в стиле "блоков по Муру"). Win32Forth.

: END-BLOCK S" END-BLOCK" ;
: BLOCK-HERE
CREATE HERE 0 , 0
BEGIN BL WORD DUP COUNT END-BLOCK COMPARE WHILE
DUP COUNT HERE SWAP CMOVE C@ DUP ALLOT + BL C, 1+
REPEAT DROP SWAP !
DOES> DUP CELL+ SWAP @ EVALUATE ;

Теперь я могу написать (соврал, надо в случае многострочного ввода использовать REFILL для доввода в WORD
BEGIN BL WORD DUP C@ 0= WHILE DROP REFILL DROP REPEAT !!!):

BLOCK-HERE ЭТО-БУДЕТ-ТАК
ДУМАЕМ
ДЕЛАЕМ
: МЕЧТАЕМ ФАНТАЗИРУЕМ ;
МЕЧТАЕМ
END-BLOCK

: ДУМАЕМ ;
: ДЕЛАЕМ ;
: ФАНТАЗИРУЕМ ;

ЭТО-БУДЕТ-ТАК


Последний раз редактировалось gudleifr Пт июл 08, 2016 16:11, всего редактировалось 2 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Ср апр 27, 2016 18:40 
Еще о "самодокументировании".
Все фортеры знают о возможности комментирования во время чтения листинга - "скобка", его компиляции - "точка-скобка" или исполнения "точка-кавычки"... Но возможно и комментирование иного рода - пустыми определениями.

: ЛЕММА-1 ;
< какие-то определения по смыслу этой леммы>
: ТЕОРЕМА-1 ;
< какие-то определения по смыслу этой теоремы>
: ТЕОРЕМА-2 ЛЕММА-1 ТЕОРЕМА-1 ;

последнее может просто не дать программисту забыть о взаимосвязи фрагментов.
Но...
В отличие от обычных комментариев, эти пустые определения можно анализировать. Например, я могу препарировать ТЕОРЕМУ-2 с целью выявить ее перекрестные ссылки.

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пн июн 27, 2016 20:33 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 790
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Как получше исхитриться, чтобы получить наиболее уникальный хеш от строки?
Да и желательно так, как можно быстрее :)
Ход моих мыслей.
: HASH 1- >R
0 SWAP
BEGIN
DUP R@ + C@
32 *
SWAP
>R + R>
R@ IF R> 1- >R
[ 2SWAP ]
AGAIN
ELSE
RDROP DROP
THEN
;
Но естественно можно придумать что-нибудь понадёжней

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 120 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.

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


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

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


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

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