Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
in4 писал(а): В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение). два раза для парной конструкции. in4 писал(а): Или даже 4 - в обработчике CATCH , может, тоже прийдется проверять на совпадение (или на границы). не понял, CATCH ну совсем тут не причем. in4 писал(а): В принципе создание таких конструкций довольно редкое дело. Может, для каких-то особых задач. да, редкое, поэтому ваять сложную конструкцию не имеет смысла. in4 писал(а): Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение. можно заменить его, только уже не ?PAIRS использовать, а: NOTICE" message body" <> IF ERROR" another message" THEN in4 писал(а): Ну и длинные тексты сообщений нужно будет копировать еще 2..4 раза... опять не понял. Боюсь надо бы примеры вам приводить. как известно, У УМНЫХ МЫСЛИ РАСХОДЯТСЯ in4 писал(а): Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет.
именно это и имеет место быть. В форке NOTICE" штатная конструкция, связанная с обработкой ошибок и выводом сообщений.
[quote="in4"]В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение).[/quote] два раза для парной конструкции.
[quote="in4"]Или даже 4 - в обработчике CATCH , может, тоже прийдется проверять на совпадение (или на границы).[/quote] не понял, CATCH ну совсем тут не причем.
[quote="in4"]В принципе создание таких конструкций довольно редкое дело. Может, для каких-то особых задач.[/quote] да, редкое, поэтому ваять сложную конструкцию не имеет смысла.
[quote="in4"]Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение.[/quote] можно заменить его, только уже не ?PAIRS использовать, а: NOTICE" message body" <> IF ERROR" another message" THEN
[quote="in4"]Ну и длинные тексты сообщений нужно будет копировать еще 2..4 раза...[/quote] опять не понял. Боюсь надо бы примеры вам приводить. как известно, У УМНЫХ МЫСЛИ РАСХОДЯТСЯ :)
[quote="in4"]Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет. [/quote]
именно это и имеет место быть. В форке NOTICE" штатная конструкция, связанная с обработкой ошибок и выводом сообщений.
|
|
|
|
Добавлено: Пт апр 24, 2009 02:04 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): in4 писал(а): Но вторую проблему не решает... какую вторую, поясните пожалуйста! Вот эту: in4 писал(а): И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... Поясню подробнее: Есть парная конструкция. Хотелось бы, чтобы она давала сообщение о проблеме. Хотелось бы, чтобы сообщение содержало текст, который бы: 1) объяснил, что случилось 2) помог локализовать ошибку. В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение). Или даже 4 - в обработчике CATCH , может, тоже прийдется проверять на совпадение (или на границы).
Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение. Ну и длинные тексты сообщений нужно будет копировать еще 2..4 раза...
В принципе создание таких конструкций довольно редкое дело. Может, для каких-то особых задач. Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет. Навеяло тем, что видел реализации циклов на базе IF...
[quote="mOleg"][quote="in4"]Но вторую проблему не решает...[/quote]какую вторую, поясните пожалуйста![/quote]Вот эту:[quote="in4"]И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste...[/quote]Поясню подробнее: Есть парная конструкция. Хотелось бы, чтобы она давала сообщение о [b]проблеме[/b]. Хотелось бы, чтобы сообщение содержало текст, который бы: 1) объяснил, что случилось 2) помог локализовать ошибку. В предложенном варианте текст сообщения будет скопирован в исходнике 3 раза (начало, конец, сообщение). Или даже 4 - в обработчике [b]CATCH[/b] , может, тоже прийдется проверять на совпадение (или на границы).
Теперь делаем новую конструкцию на базе старой. Хотелось бы, чтобы можно было заменить сообщение. Ну и [b]длинные[/b] тексты сообщений нужно будет копировать еще 2..4 раза...
В принципе создание таких конструкций довольно редкое дело. Может, для каких-то особых задач. Тогда можно просто реализовать все аналогично стандартным конструкциям и проблемы не будет. Навеяло тем, что видел реализации циклов на базе [b]IF[/b]...
|
|
|
|
Добавлено: Пт апр 24, 2009 01:51 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
garbler писал(а): пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал,
вот, кстати, замечательно. Вы предлагаете написать BUILD, что достаточно нетривиально сделать, ради невыигрышного решения
[quote="garbler"]пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал,[/quote]
вот, кстати, замечательно. Вы предлагаете написать BUILD, что достаточно нетривиально сделать, ради невыигрышного решения :)
|
|
|
|
Добавлено: Ср апр 22, 2009 21:25 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
кстати, насчет copy+paste - это моя рекомендация, которую не обязательно выполнять, если вы умеете безошибочно печтатать. Однако, после компиляции программы можно просто просмотреть список сообщений на "дубляж" строк и обнаружить описки.
да и в конце концов, copy+paste не во всех случаях "зло"
кстати, насчет copy+paste - это моя рекомендация, которую не обязательно выполнять, если вы умеете безошибочно печтатать. Однако, после компиляции программы можно просто просмотреть список сообщений на "дубляж" строк и обнаружить описки.
да и в конце концов, copy+paste не во всех случаях "зло"
|
|
|
|
Добавлено: Ср апр 22, 2009 21:23 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
garbler писал(а): и одновременно избавиться от опечаток
вы шутите? нет, серьезно, вы шутите?
опечатки в вашем случае буду такие же, как и в моем.
в конечном итоге я могу проверить есть ли уже такое сообщение в базе или его еще нет, но тогда будет наложено дополнительное ограничение на расположение кода в программе. В моем же случае проверка может быть раньше, чем значение, которое надо проверять.
[quote="garbler"]и одновременно избавиться от опечаток [/quote]
вы шутите? нет, серьезно, вы шутите?
опечатки в вашем случае буду такие же, как и в моем.
в конечном итоге я могу проверить есть ли уже такое сообщение в базе или его еще нет, но тогда будет наложено дополнительное ограничение на расположение кода в программе. В моем же случае проверка может быть раньше, чем значение, которое надо проверять.
|
|
|
|
Добавлено: Ср апр 22, 2009 21:21 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал, я просто показал, как получать уникальную константу и одновременно избавиться от опечаток (пусть контролем транслятор занимается).
в остальном какие же могут быть возражения? ведь NOTICE" остался за кадром, а на него можно навесить всё, что требуется (и о чём in4 ворчал).
пункт 1 зависит от качества системы "BUILD" и потому спорный, пункты 2 и 3 я вообще не рассматривал, я просто показал, как получать уникальную константу и одновременно избавиться от опечаток (пусть контролем транслятор занимается).
в остальном какие же могут быть возражения? ведь NOTICE" остался за кадром, а на него можно навесить всё, что требуется (и о чём [b]in4[/b] ворчал).
|
|
|
|
Добавлено: Ср апр 22, 2009 21:15 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
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 , что я считаю ужастным, и ради избежания этой дряни делал сию либу
насчет остальных замечаний говорить не буду. я не считаю ваши варианты приемлемыми, я над ними уже думал и ушел от них.
кроме того, вы не замечаете, что предлагаете мне городить код более сложный, чем мой.
Я выложил свое решение и свое видение. Можете предлагать альтернативу, НО, желательно обосновать ее преимущества
[quote="garbler"]чем плох такой подход? Код:CREATE until_without_begin ... bla bla <MARK until_without_begin ; IMMEDIATE с отвечающим ему кодом в другом слове: Код:... until_without_begin <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"[/quote]
он плох тем:
1) необходимо создать слово until_without_begin, которое в моем варианте нафиг не нужно, которое будет загромождать словарь
2) значительно более громоздкое и длинное выражение
3) вы не избавились от -2004 THROW , что я считаю ужастным, и ради избежания этой дряни делал сию либу
насчет остальных замечаний говорить не буду. я не считаю ваши варианты приемлемыми, я над ними уже думал и ушел от них.
кроме того, вы не замечаете, что предлагаете мне городить код более сложный, чем мой.
Я выложил свое решение и свое видение. Можете предлагать альтернативу, НО, желательно обосновать ее преимущества ;)
|
|
|
|
Добавлено: Ср апр 22, 2009 20:50 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
in4 писал(а): И так прийдется делать по всем аналогичным местам... да, только таких мест много обычно не бывает. А подход надежнее, чем расставлять числа с потолка. in4 писал(а): И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... почему же нельзя? сколько угодно. Сообщение остается в базе, с ним можно всегда работать. То есть ставить ?PAIRS" с одним текстом сообщения без проблем можно во многих местах. in4 писал(а): Это вообще-то проблема "слишком умных" слов - сложность повторного использования... А "слова должны быть тупыми"... в данном случае все достаточно просто. in4 писал(а): Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение. ?чем оно лучше? попробуйте реализовать, и поймете что оно сложнее будет! (я пробовал это сначала = фигово выходит) in4 писал(а): Но вторую проблему не решает...
какую вторую, поясните пожалуйста!
[quote="in4"]И так прийдется делать по всем аналогичным местам...[/quote] да, только таких мест много обычно не бывает. А подход надежнее, чем расставлять числа с потолка.
[quote="in4"]И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste...[/quote] почему же нельзя? сколько угодно. Сообщение остается в базе, с ним можно всегда работать. То есть ставить ?PAIRS" с одним текстом сообщения без проблем можно во многих местах.
[quote="in4"]Это вообще-то проблема "слишком умных" слов - сложность повторного использования... А "слова должны быть тупыми"...[/quote] в данном случае все достаточно просто.
[quote="in4"]Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение. [/quote] ?чем оно лучше? попробуйте реализовать, и поймете что оно сложнее будет! (я пробовал это сначала = фигово выходит)
[quote="in4"]Но вторую проблему не решает...[/quote]
какую вторую, поясните пожалуйста!
|
|
|
|
Добавлено: Ср апр 22, 2009 20:45 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
чем плох такой подход?
Код: 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 там является универсальным идентификатором и его можно получать даже от чисел, строк, символов и прочих "типов данных".
чем плох такой подход?
[code]CREATE until_without_begin
... bla bla <MARK until_without_begin ; IMMEDIATE[/code]
с отвечающим ему кодом в другом слове:
[code]... until_without_begin <> IF -2004 THROW THEN \ ABORT" UNTIL без BEGIN !"[/code]
если есть сомнения во взаимозаменяемости addr и n, то конвертер встраивается тут-же: [code]: mkMARK CREATE DOES> ... действия по превращению addr в n ... ; mkMARK until_without_begin[/code]
для надёжности (если сегменты кода/данных/имени разнесены), достаточно компилировать дополнительную константу: [code]: mkMARK CREATE 0 , DOES> ... и т.д. ... ; mkMARK until_without_begin[/code]
p.s. в фортофорках со словарями работают гораздо более смело, например, часто используют XT в качестве флага [code]: (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[/code] более того, XT там является универсальным идентификатором и его можно получать даже от чисел, строк, символов и прочих "типов данных".
|
|
|
|
Добавлено: Ср апр 22, 2009 11:08 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): соответственно, сообщение в ?PAIRS надежнее всего копировать с помощью метода copy+paste И так прийдется делать по всем аналогичным местам...
И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... Это вообще-то проблема "слишком умных" слов - сложность повторного использования... А "слова должны быть тупыми"...
Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение. Но вторую проблему не решает...
[quote="mOleg"]соответственно, сообщение в ?PAIRS надежнее всего копировать с помощью метода copy+paste[/quote]И так прийдется делать по всем аналогичным местам...
И нельзя будет для новых конструкций использовать старые - прийдется переписывать, и опять copy+paste... ;) Это вообще-то проблема "слишком умных" слов - сложность повторного использования... ;) А "слова должны быть тупыми"...
Хотя если б магическое число получать из адреса строки... это было бы более приемлемое решение. Но вторую проблему не решает... :(
|
|
|
|
Добавлено: Ср апр 22, 2009 04:42 |
|
|
|
|
|
Заголовок сообщения: |
контроль парности конструкций |
|
|
достаточно часто в Форте встречается конструкция подобная следующей:
... 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>
достаточно часто в Форте встречается конструкция подобная следующей:
... 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>
|
|
|
|
Добавлено: Вт апр 21, 2009 23:00 |
|
|
|
|