Forth http://www.fforum.winglion.ru/ |
|
контроль парности конструкций http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2072 |
Страница 1 из 1 |
Автор: | mOleg [ Вт апр 21, 2009 23:00 ] |
Заголовок сообщения: | контроль парности конструкций |
достаточно часто в Форте встречается конструкция подобная следующей: ... 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> |
Автор: | in4 [ Ср апр 22, 2009 04:42 ] |
Заголовок сообщения: | |
mOleg писал(а): соответственно, сообщение в ?PAIRS надежнее всего копировать с помощью И так прийдется делать по всем аналогичным местам...
метода copy+paste И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... Это вообще-то проблема "слишком умных" слов - сложность повторного использования... А "слова должны быть тупыми"... Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение. Но вторую проблему не решает... |
Автор: | garbler [ Ср апр 22, 2009 11:08 ] |
Заголовок сообщения: | |
чем плох такой подход? Код: 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 там является универсальным идентификатором и его можно получать даже от чисел, строк, символов и прочих "типов данных".
: (') ( -- 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 |
Автор: | mOleg [ Ср апр 22, 2009 20:45 ] |
Заголовок сообщения: | |
in4 писал(а): И так прийдется делать по всем аналогичным местам... да, только таких мест много обычно не бывает. А подход надежнее, чем расставлять числа с потолка. in4 писал(а): И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... почему же нельзя? сколько угодно. Сообщение остается в базе, с ним можно всегда работать. То есть ставить ?PAIRS" с одним текстом сообщения без проблем можно во многих местах. in4 писал(а): Это вообще-то проблема "слишком умных" слов - сложность повторного использования... А "слова должны быть тупыми"... в данном случае все достаточно просто. in4 писал(а): Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение. ?чем оно лучше? попробуйте реализовать, и поймете что оно сложнее будет! (я пробовал это сначала = фигово выходит) in4 писал(а): Но вторую проблему не решает...
какую вторую, поясните пожалуйста! |
Автор: | mOleg [ Ср апр 22, 2009 20:50 ] |
Заголовок сообщения: | |
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 , что я считаю ужастным, и ради избежания этой дряни делал сию либу насчет остальных замечаний говорить не буду. я не считаю ваши варианты приемлемыми, я над ними уже думал и ушел от них. кроме того, вы не замечаете, что предлагаете мне городить код более сложный, чем мой. Я выложил свое решение и свое видение. Можете предлагать альтернативу, НО, желательно обосновать ее преимущества |
Автор: | garbler [ Ср апр 22, 2009 21:15 ] |
Заголовок сообщения: | |
пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал, я просто показал, как получать уникальную константу и одновременно избавиться от опечаток (пусть контролем транслятор занимается). в остальном какие же могут быть возражения? ведь NOTICE" остался за кадром, а на него можно навесить всё, что требуется (и о чём in4 ворчал). |
Автор: | mOleg [ Ср апр 22, 2009 21:21 ] |
Заголовок сообщения: | |
garbler писал(а): и одновременно избавиться от опечаток
вы шутите? нет, серьезно, вы шутите? опечатки в вашем случае буду такие же, как и в моем. в конечном итоге я могу проверить есть ли уже такое сообщение в базе или его еще нет, но тогда будет наложено дополнительное ограничение на расположение кода в программе. В моем же случае проверка может быть раньше, чем значение, которое надо проверять. |
Автор: | mOleg [ Ср апр 22, 2009 21:23 ] |
Заголовок сообщения: | |
кстати, насчет copy+paste - это моя рекомендация, которую не обязательно выполнять, если вы умеете безошибочно печтатать. Однако, после компиляции программы можно просто просмотреть список сообщений на "дубляж" строк и обнаружить описки. да и в конце концов, copy+paste не во всех случаях "зло" |
Автор: | mOleg [ Ср апр 22, 2009 21:25 ] |
Заголовок сообщения: | |
garbler писал(а): пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал,
вот, кстати, замечательно. Вы предлагаете написать BUILD, что достаточно нетривиально сделать, ради невыигрышного решения |
Автор: | in4 [ Пт апр 24, 2009 01:51 ] |
Заголовок сообщения: | |
mOleg писал(а): in4 писал(а): Но вторую проблему не решает... какую вторую, поясните пожалуйста!in4 писал(а): И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... Поясню подробнее: Есть парная конструкция. Хотелось бы, чтобы она давала сообщение о проблеме. Хотелось бы, чтобы сообщение содержало текст, который бы: 1) объяснил, что случилось 2) помог локализовать ошибку. В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение). Или даже 4 - в обработчике CATCH , может, тоже прийдется проверять на совпадение (или на границы).
Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение. Ну и длинные тексты сообщений нужно будет копировать еще 2..4 раза... В принципе создание таких конструкций довольно редкое дело. Может, для каких-то особых задач. Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет. Навеяло тем, что видел реализации циклов на базе IF... |
Автор: | mOleg [ Пт апр 24, 2009 02:04 ] |
Заголовок сообщения: | |
in4 писал(а): В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение). два раза для парной конструкции. in4 писал(а): Или даже 4 - в обработчике CATCH , может, тоже прийдется проверять на совпадение (или на границы). не понял, CATCH ну совсем тут не причем. in4 писал(а): В принципе создание таких конструкций довольно редкое дело. Может, для каких-то особых задач. да, редкое, поэтому ваять сложную конструкцию не имеет смысла. in4 писал(а): Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение. можно заменить его, только уже не ?PAIRS использовать, а: NOTICE" message body" <> IF ERROR" another message" THEN in4 писал(а): Ну и длинные тексты сообщений нужно будет копировать еще 2..4 раза... опять не понял. Боюсь надо бы примеры вам приводить. как известно, У УМНЫХ МЫСЛИ РАСХОДЯТСЯ in4 писал(а): Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет.
именно это и имеет место быть. В форке NOTICE" штатная конструкция, связанная с обработкой ошибок и выводом сообщений. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |