Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт ноя 14, 2019 15:02

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: контроль парности конструкций
СообщениеДобавлено: Вт апр 21, 2009 23:00 
Не в сети
Moderator
Moderator
Аватара пользователя

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

... bla bla <MARK 3 ; IMMEDIATE

с отвечающим ему кодом в другом слове:

... 3 <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"

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

... bla bla bla <MARK NOTICE" UNTIL без BEGIN !" ; IMMEDIATE
где сообщение задает строка ограниченная NOTICE" с одной стороны и " с другой,
напомню, что это слово компилирует литеральное значение уникального кода сообщения.
В отвечающем коде будет:
... ?PAIRS" UNTIL без BEGIN !" ...
и все! если код сообщения, попавший на вход слова (PAIRS) не будет совпадать
с кодом сообщения из второй части, будет вызван THROW с кодом сообщения,
находящегося в тексте за ?PAIRS" до закрывающей кавычки"
( соответственно, сообщение в ?PAIRS надежнее всего копировать с помощью
метода copy+paste , чтобы ошибки в сообщении не заставили вас перерывать код.
<pre>
\ 21.04.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ автоматическая проверка корректности проверяющих механизмов

\ значения msg должны совпадать, если не совпадают, выполнить THROW
\ с кодом msg2 (код слова в ядре!)
\ : (PAIRS) ( msg1 msg2 --> ) DDUP <> IF THROW THEN DDROP ;

\ запомнить код msg сообщения, находящегося в " message string"
\ компилировать код (PAIRS) проверяющий совпадение сообщений
: ?PAIRS" ( / message string" --> )
[COMPILE] NOTICE"
COMPILE (PAIRS)
; IMMEDIATE

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------
test{

: sample NOTICE" Ожидается данное сообщение!" ;
: test ?PAIRS" Ожидается данное сообщение!" 9875204 ;

sample test 9875204 <> THROW
123123 ' test CATCH sample <> THROW 123123 <> THROW

}test
</pre>

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


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

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
соответственно, сообщение в ?PAIRS надежнее всего копировать с помощью
метода copy+paste
И так прийдется делать по всем аналогичным местам...

И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... ;) Это вообще-то проблема "слишком умных" слов - сложность повторного использования... ;) А "слова должны быть тупыми"...

Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение. Но вторую проблему не решает... :(

_________________
With best wishes, in4.


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

Зарегистрирован: Вт сен 11, 2007 11:07
Сообщения: 187
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
чем плох такой подход?

Код:
CREATE until_without_begin

... bla bla <MARK until_without_begin ; IMMEDIATE


с отвечающим ему кодом в другом слове:

Код:
... until_without_begin <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"


если есть сомнения во взаимозаменяемости addr и n, то конвертер встраивается тут-же:
Код:
: mkMARK CREATE DOES> ... действия по превращению addr в n ... ; mkMARK until_without_begin


для надёжности (если сегменты кода/данных/имени разнесены), достаточно компилировать дополнительную константу:
Код:
: mkMARK CREATE 0 , DOES> ... и т.д. ... ; mkMARK until_without_begin


p.s. в фортофорках со словарями работают гораздо более смело, например, часто используют XT в качестве флага
Код:
: (todo) ;

: (') ( -- xt ) BL WORD FIND 0= IF DROP ['] (todo) THEN ;
: ?' ( xt -- flag ) >IN @ SWAP (') = IF DROP TRUE ELSE >IN ! FALSE THEN ;
: ...; ( -- flag ) ['] ; ?' INVERT ;

: variables:
    BEGIN ...; WHILE VARIABLE REPEAT
;


.( Testing...) CR
variables: a b c ; 5 . CR

3 a ! 4 b ! a @ b @ + c !
c @ . CR

BYE
более того, XT там является универсальным идентификатором и его можно получать даже от чисел, строк, символов и прочих "типов данных".


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

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

да, только таких мест много обычно не бывает.
А подход надежнее, чем расставлять числа с потолка.

in4 писал(а):
И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste...

почему же нельзя? сколько угодно. Сообщение остается в базе, с ним можно всегда работать. То есть ставить ?PAIRS" с одним текстом сообщения без проблем можно во многих местах.

in4 писал(а):
Это вообще-то проблема "слишком умных" слов - сложность повторного использования... А "слова должны быть тупыми"...

в данном случае все достаточно просто.

in4 писал(а):
Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение.

?чем оно лучше? попробуйте реализовать, и поймете что оно сложнее будет! (я пробовал это сначала = фигово выходит)

in4 писал(а):
Но вторую проблему не решает...

какую вторую, поясните пожалуйста!

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
garbler писал(а):
чем плох такой подход?
Код:CREATE until_without_begin
... bla bla <MARK until_without_begin ; IMMEDIATE
с отвечающим ему кодом в другом слове:
Код:... until_without_begin <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"

он плох тем:
1) необходимо создать слово until_without_begin, которое в моем варианте нафиг не нужно, которое будет загромождать словарь
2) значительно более громоздкое и длинное выражение
3) вы не избавились от -2004 THROW , что я считаю ужастным, и ради избежания этой дряни делал сию либу

насчет остальных замечаний говорить не буду. я не считаю ваши варианты приемлемыми, я над ними уже думал и ушел от них.
кроме того, вы не замечаете, что предлагаете мне городить код более сложный, чем мой.
Я выложил свое решение и свое видение. Можете предлагать альтернативу, НО, желательно обосновать ее преимущества ;)

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


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

Зарегистрирован: Вт сен 11, 2007 11:07
Сообщения: 187
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал, я просто показал, как получать уникальную константу и одновременно избавиться от опечаток (пусть контролем транслятор занимается).

в остальном какие же могут быть возражения? ведь NOTICE" остался за кадром, а на него можно навесить всё, что требуется (и о чём in4 ворчал).


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

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

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

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
кстати, насчет copy+paste - это моя рекомендация, которую не обязательно выполнять, если вы умеете безошибочно печтатать. Однако, после компиляции программы можно просто просмотреть список сообщений на "дубляж" строк и обнаружить описки.
да и в конце концов, copy+paste не во всех случаях "зло"

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
garbler писал(а):
пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал,

вот, кстати, замечательно. Вы предлагаете написать BUILD, что достаточно нетривиально сделать, ради невыигрышного решения :)

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


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

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
in4 писал(а):
Но вторую проблему не решает...
какую вторую, поясните пожалуйста!
Вот эту:
in4 писал(а):
И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste...
Поясню подробнее: Есть парная конструкция. Хотелось бы, чтобы она давала сообщение о проблеме. Хотелось бы, чтобы сообщение содержало текст, который бы: 1) объяснил, что случилось 2) помог локализовать ошибку. В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение). Или даже 4 - в обработчике CATCH , может, тоже прийдется проверять на совпадение (или на границы).

Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение. Ну и длинные тексты сообщений нужно будет копировать еще 2..4 раза...

В принципе создание таких конструкций довольно редкое дело. Может, для каких-то особых задач. Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет. Навеяло тем, что видел реализации циклов на базе IF...

_________________
With best wishes, in4.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
in4 писал(а):
В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение).

два раза для парной конструкции.

in4 писал(а):
Или даже 4 - в обработчике CATCH , может, тоже прийдется проверять на совпадение (или на границы).

не понял, CATCH ну совсем тут не причем.

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

да, редкое, поэтому ваять сложную конструкцию не имеет смысла.

in4 писал(а):
Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение.

можно заменить его, только уже не ?PAIRS использовать, а:
NOTICE" message body" <> IF ERROR" another message" THEN

in4 писал(а):
Ну и длинные тексты сообщений нужно будет копировать еще 2..4 раза...

опять не понял. Боюсь надо бы примеры вам приводить.
как известно, У УМНЫХ МЫСЛИ РАСХОДЯТСЯ :)

in4 писал(а):
Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет.

именно это и имеет место быть. В форке NOTICE" штатная конструкция, связанная с обработкой ошибок и выводом сообщений.

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


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

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


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

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


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

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