Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Задача : отладочное слово |
|
|
Прошу прощения, ошибочка вышла. Исправил, вроде щас нормально работает Код: VARIABLE PARAMETRS VARIABLE DEFINED_PARAMETRS
: ?DEPTH DEPTH = 0= IF TRUE ABORT" Wrong number of parameters" THEN ;
: ?SIGN ( Saddr u -- Saddr1 u1 TRUE|FALSE ) >R DUP C@ [CHAR] - = IF 1 CHARS + R> 1- TRUE ELSE R> FALSE THEN ;
: ?NUMBER ( Saddr u -- TRUE|FALSE ) ( 2DUP ?DOUBLE IF 2SWAP 2DROP ELSE 2DROP THEN ) 2DUP ?SIGN IF 2SWAP 2DROP ELSE 2DROP THEN 0 DO DUP I + C@ [CHAR] 0 1- [CHAR] 9 1+ WITHIN 0= IF NEGATE LEAVE THEN LOOP 0 > ;
: >PARAMETRS @ ; : >DEFINED_PARAMETRS CELL+ @ ;
: INITDATA PARAMETRS 0! DEFINED_PARAMETRS 0! HERE 0. , ,
BEGIN PARAMETRS 1+! PARSE-NAME 2DUP S" )" COMPARE >R 2DUP S" --" COMPARE >R R@ 0= IF [CHAR] ) SkipUpTo -1 PARAMETRS +! THEN
OVER C@ [CHAR] " = DUP IF [CHAR] " SkipUpTo >IN 1+! -1 PARAMETRS +! THEN 0= R> 0 <> R@ AND AND IF 2DUP ?NUMBER IF ?SIGN IF -1 ELSE 1 THEN -ROT 0. 2SWAP >NUMBER 2DROP D>S * PARAMETRS @ , , DEFINED_PARAMETRS 1+! ELSE 2DROP THEN ELSE 2DROP THEN
R> 0= UNTIL >R R@ PARAMETRS @ OVER CELL+ DEFINED_PARAMETRS @ SWAP ! SWAP ! R> ;
: ?number_of_parameters >R R@ >PARAMETRS ?DEPTH R> ;
: test_parameters >R R@ >DEFINED_PARAMETRS IF R@ >DEFINED_PARAMETRS 2 * CELLS R@ 2 CELLS + + R@ 2 CELLS + R> @ -ROT DO DUP I @ - PICK I CELL+ @ = 0= IF TRUE ABORT" wrong parameters" THEN 2 CELLS +LOOP DROP ELSE R> DROP THEN ;
: (precentli: ?COMP 0 BRANCH, >MARK INITDATA >R 1 >RESOLVE R> LIT, POSTPONE ?number_of_parameters POSTPONE test_parameters ; IMMEDIATE
\ ПРОВЕРКИ
: test (precentli: A " отрицательное значение" -9 ) CR ." test_0" ;
: test2 (precentli: a b c ) ." test2" CR . . . 10 -9 test CR . . ;
: test1 (precentli: 1 2 -- 3 ) ." test_1" CR ;
: test3 (precentli: ) CR ." test3 - BEZ PARAMETROV" ;
1 2 test1 . . CR 45 60 0 test2 test3
Прошу прощения, ошибочка вышла. Исправил, вроде щас нормально работает [code]VARIABLE PARAMETRS VARIABLE DEFINED_PARAMETRS
: ?DEPTH DEPTH = 0= IF TRUE ABORT" Wrong number of parameters" THEN ;
: ?SIGN ( Saddr u -- Saddr1 u1 TRUE|FALSE ) >R DUP C@ [CHAR] - = IF 1 CHARS + R> 1- TRUE ELSE R> FALSE THEN ;
: ?NUMBER ( Saddr u -- TRUE|FALSE ) ( 2DUP ?DOUBLE IF 2SWAP 2DROP ELSE 2DROP THEN ) 2DUP ?SIGN IF 2SWAP 2DROP ELSE 2DROP THEN 0 DO DUP I + C@ [CHAR] 0 1- [CHAR] 9 1+ WITHIN 0= IF NEGATE LEAVE THEN LOOP 0 > ;
: >PARAMETRS @ ; : >DEFINED_PARAMETRS CELL+ @ ;
: INITDATA PARAMETRS 0! DEFINED_PARAMETRS 0! HERE 0. , ,
BEGIN PARAMETRS 1+! PARSE-NAME 2DUP S" )" COMPARE >R 2DUP S" --" COMPARE >R R@ 0= IF [CHAR] ) SkipUpTo -1 PARAMETRS +! THEN
OVER C@ [CHAR] " = DUP IF [CHAR] " SkipUpTo >IN 1+! -1 PARAMETRS +! THEN 0= R> 0 <> R@ AND AND IF 2DUP ?NUMBER IF ?SIGN IF -1 ELSE 1 THEN -ROT 0. 2SWAP >NUMBER 2DROP D>S * PARAMETRS @ , , DEFINED_PARAMETRS 1+! ELSE 2DROP THEN ELSE 2DROP THEN
R> 0= UNTIL >R R@ PARAMETRS @ OVER CELL+ DEFINED_PARAMETRS @ SWAP ! SWAP ! R> ;
: ?number_of_parameters >R R@ >PARAMETRS ?DEPTH R> ;
: test_parameters >R R@ >DEFINED_PARAMETRS IF R@ >DEFINED_PARAMETRS 2 * CELLS R@ 2 CELLS + + R@ 2 CELLS + R> @ -ROT DO DUP I @ - PICK I CELL+ @ = 0= IF TRUE ABORT" wrong parameters" THEN 2 CELLS +LOOP DROP ELSE R> DROP THEN ;
: (precentli: ?COMP 0 BRANCH, >MARK INITDATA >R 1 >RESOLVE R> LIT, POSTPONE ?number_of_parameters POSTPONE test_parameters ; IMMEDIATE
\ ПРОВЕРКИ
: test (precentli: A " отрицательное значение" -9 ) CR ." test_0" ;
: test2 (precentli: a b c ) ." test2" CR . . . 10 -9 test CR . . ;
: test1 (precentli: 1 2 -- 3 ) ." test_1" CR ;
: test3 (precentli: ) CR ." test3 - BEZ PARAMETROV" ;
1 2 test1 . . CR 45 60 0 test2 test3[/code]
|
|
|
|
Добавлено: Вс июн 13, 2010 00:48 |
|
|
|
|
|
Заголовок сообщения: |
Re: Задача : отладочное слово |
|
|
m1ha писал(а): Написано на SPF.С уважением m1ha Замечательно... только не пойму, что делают тесты Код: Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.20 Build 001 at 21.Jan.2009
pr.f Ok test1 proverka Ok test2 eshe proverka Ok 1 2 4 test 1 2 4 test ^ Wrong number of parameters 1 2 test 1 2 test ^ Wrong number of parameters 4 1 test 4 1 test ^ Wrong number of parameters 4 1 2 test 4 1 2 test ^ Wrong number of parameters test 2033879029 448536 test ^ -4 Исчерпание стека
из-за этого трудно разобраться в остальном Уточняю - непонятно, сколько и каких параметров нужно подать на стек в слове test p.s. у меня precentl y:
[quote="m1ha"]Написано на SPF.С уважением m1ha[/quote] Замечательно... только не пойму, что делают тесты [code]Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.20 Build 001 at 21.Jan.2009
pr.f Ok test1 proverka Ok test2 eshe proverka Ok 1 2 4 test 1 2 4 test ^ Wrong number of parameters 1 2 test 1 2 test ^ Wrong number of parameters 4 1 test 4 1 test ^ Wrong number of parameters 4 1 2 test 4 1 2 test ^ Wrong number of parameters test 2033879029 448536 test ^ -4 Исчерпание стека
[/code] из-за этого трудно разобраться в остальном Уточняю - непонятно, сколько и каких параметров нужно подать на стек в слове test
p.s. у меня precentl[b]y[/b]: :)
|
|
|
|
Добавлено: Сб июн 12, 2010 22:25 |
|
|
|
|
|
Заголовок сообщения: |
Re: Задача : отладочное слово |
|
|
Код: VARIABLE PARAMETRS VARIABLE DEFINED_PARAMETRS
: ?DEPTH DEPTH = 0= IF TRUE ABORT" Wrong number of parameters" THEN ;
: ?SIGN ( Saddr u -- Saddr1 u1 TRUE|FALSE ) >R DUP C@ [CHAR] - = IF 1 CHARS + R> 1- TRUE ELSE R> FALSE THEN ;
: ?NUMBER ( Saddr u -- TRUE|FALSE ) ( 2DUP ?DOUBLE IF 2SWAP 2DROP ELSE 2DROP THEN ) 2DUP ?SIGN IF 2SWAP 2DROP ELSE 2DROP THEN 0 DO DUP I + C@ [CHAR] 0 1- [CHAR] 9 1+ WITHIN 0= IF NEGATE LEAVE THEN LOOP 0 > ;
: >DATA LATEST NAME> 5 + ; : >PARAMETRS >DATA @ ; : >DEFINED_PARAMETRS >DATA CELL+ @ ;
: INITDATA ( -- addr ) PARAMETRS 0! DEFINED_PARAMETRS 0! HERE 0. , ,
BEGIN PARAMETRS 1+! PARSE-NAME 2DUP S" )" COMPARE >R 2DUP S" --" COMPARE >R R@ 0= IF [CHAR] ) SkipUpTo -1 PARAMETRS +! THEN
OVER C@ [CHAR] " = DUP IF [CHAR] " SkipUpTo >IN 1+! -1 PARAMETRS +! THEN 0= R> 0 <> R@ AND AND IF 2DUP ?NUMBER IF ?SIGN IF -1 ELSE 1 THEN -ROT 0. 2SWAP >NUMBER 2DROP D>S * PARAMETRS @ , , DEFINED_PARAMETRS 1+! ELSE 2DROP THEN ELSE 2DROP THEN
R> 0= UNTIL PARAMETRS @ OVER CELL+ DEFINED_PARAMETRS @ SWAP ! SWAP ! ;
: ?number_of_parameters >PARAMETRS ?DEPTH ;
: test_parameters >DEFINED_PARAMETRS IF >DATA 2 CELLS + DUP >DEFINED_PARAMETRS 2* CELLS + SWAP DO I @ >PARAMETRS 1- SWAP - PICK I CELL+ @ = 0= IF TRUE ABORT" wrong parameters" THEN 2 CELLS +LOOP THEN ;
: (precentli: ?COMP 0 BRANCH, >MARK INITDATA 1 >RESOLVE POSTPONE ?number_of_parameters POSTPONE test_parameters
; IMMEDIATE
: test (precentli: raz dva -- " tretij PARAMETR=" 4 ) . . ; : test1 (precentli: -- ) ." proverka " ; : test2 (precentli: ) ." eshe proverka" ; Написано на SPF. С уважением m1ha
[code]VARIABLE PARAMETRS VARIABLE DEFINED_PARAMETRS
: ?DEPTH DEPTH = 0= IF TRUE ABORT" Wrong number of parameters" THEN ;
: ?SIGN ( Saddr u -- Saddr1 u1 TRUE|FALSE ) >R DUP C@ [CHAR] - = IF 1 CHARS + R> 1- TRUE ELSE R> FALSE THEN ;
: ?NUMBER ( Saddr u -- TRUE|FALSE ) ( 2DUP ?DOUBLE IF 2SWAP 2DROP ELSE 2DROP THEN ) 2DUP ?SIGN IF 2SWAP 2DROP ELSE 2DROP THEN 0 DO DUP I + C@ [CHAR] 0 1- [CHAR] 9 1+ WITHIN 0= IF NEGATE LEAVE THEN LOOP 0 > ;
: >DATA LATEST NAME> 5 + ; : >PARAMETRS >DATA @ ; : >DEFINED_PARAMETRS >DATA CELL+ @ ;
: INITDATA ( -- addr ) PARAMETRS 0! DEFINED_PARAMETRS 0! HERE 0. , ,
BEGIN PARAMETRS 1+! PARSE-NAME 2DUP S" )" COMPARE >R 2DUP S" --" COMPARE >R R@ 0= IF [CHAR] ) SkipUpTo -1 PARAMETRS +! THEN
OVER C@ [CHAR] " = DUP IF [CHAR] " SkipUpTo >IN 1+! -1 PARAMETRS +! THEN 0= R> 0 <> R@ AND AND IF 2DUP ?NUMBER IF ?SIGN IF -1 ELSE 1 THEN -ROT 0. 2SWAP >NUMBER 2DROP D>S * PARAMETRS @ , , DEFINED_PARAMETRS 1+! ELSE 2DROP THEN ELSE 2DROP THEN
R> 0= UNTIL PARAMETRS @ OVER CELL+ DEFINED_PARAMETRS @ SWAP ! SWAP ! ;
: ?number_of_parameters >PARAMETRS ?DEPTH ;
: test_parameters >DEFINED_PARAMETRS IF >DATA 2 CELLS + DUP >DEFINED_PARAMETRS 2* CELLS + SWAP DO I @ >PARAMETRS 1- SWAP - PICK I CELL+ @ = 0= IF TRUE ABORT" wrong parameters" THEN 2 CELLS +LOOP THEN ;
: (precentli: ?COMP 0 BRANCH, >MARK INITDATA 1 >RESOLVE POSTPONE ?number_of_parameters POSTPONE test_parameters
; IMMEDIATE
: test (precentli: raz dva -- " tretij PARAMETR=" 4 ) . . ; : test1 (precentli: -- ) ." proverka " ; : test2 (precentli: ) ." eshe proverka" ;[/code]
Написано на SPF. С уважением m1ha
|
|
|
|
Добавлено: Сб июн 12, 2010 19:12 |
|
|
|
|
|
Заголовок сообщения: |
Re: Задача : отладочное слово |
|
|
rmammoth писал(а): Исходники и проект для QtCreator'а здесь: http://ifolder.ru/18045748 , вместе с окончательной реализацией (presently: , которая теперь выглядит так: Замечательно. Теперь может быть кто-то предложит вариант для обычного форта.
[quote="rmammoth"]Исходники и проект для QtCreator'а здесь: http://ifolder.ru/18045748 , вместе с окончательной реализацией (presently: , которая теперь выглядит так:[/quote] Замечательно. Теперь может быть кто-то предложит вариант для обычного форта.
|
|
|
|
Добавлено: Вс июн 06, 2010 19:25 |
|
|
|
|
|
Заголовок сообщения: |
Re: Задача : отладочное слово |
|
|
вопрос писал(а): rmammoth писал(а): Решение здесь: viewtopic.php?f=9&p=27783#p27783, правда, не совсем честное, так как возникло при обсуждении расширений Форта и использует их. если б система была доступна - то чем оно не совсем честное? Цитата: 7) обязательно указание на форт-систему, для которой написан код; версию системы. В случае уникальности форт-системы обязательна прямая ссылка, по которой она может быть найдена. это из правилИсходники и проект для QtCreator'а здесь: http://ifolder.ru/18045748 , вместе с окончательной реализацией (presently: , которая теперь выглядит так: Код: $: ps :: (stack-checker)
: (presently: # ( . --> . ) Compiles info for runtime stack state validation; immediate, compile-time only ?comp [$ps $! begin token dup ")" <> if ?parse if >$ else $marker endif false endif until compile (stack-checker) $? , begin $? while $> , repeat $] ; immediate
: (stack-checker) # ( . --> . ) Throws error on wrong stack state r> dup @ swap 1+ 2 ($ depth @0 < if "Stack size must be >= " @0 'str str-concat error endif @0 0 do @1 i + @ marker? not if i 1+ pick != if "Unexpected value on stack, must be " @1 i + @ 'str " at pos. " i 'str str-concat str-concat str-concat error endif endif loop @1 @0 + >r $) ;
Там же примеры использования Код: : test-1 # Only 1 2 3 4 on top of stack will be accepted with test1 (presently: 1 2 3 4 ) . . . . ;
: test-2 # 'test2' requires 6 parameters on stack, with 100 on top and "three" at index 3 (presently: a b "three" c d 100 ) . . . . . . ;
[quote="вопрос"][quote="rmammoth"]Решение здесь: http://fforum.winglion.ru/viewtopic.php?f=9&p=27783#p27783, правда, не совсем честное, :) так как возникло при обсуждении расширений Форта и использует их.[/quote] если б система была доступна - то чем оно не совсем честное?
[quote]7) обязательно указание на форт-систему, для которой написан код; версию системы. В случае уникальности форт-системы обязательна прямая ссылка, по которой она может быть найдена.[/quote]это из [url=http://fforum.winglion.ru/viewtopic.php?f=19&t=719]правил[/url][/quote]
Исходники и проект для QtCreator'а здесь: http://ifolder.ru/18045748 , вместе с окончательной реализацией (presently: , которая теперь выглядит так:
[code]$: ps :: (stack-checker)
: (presently: # ( . --> . ) Compiles info for runtime stack state validation; immediate, compile-time only ?comp [$ps $! begin token dup ")" <> if ?parse if >$ else $marker endif false endif until compile (stack-checker) $? , begin $? while $> , repeat $] ; immediate
: (stack-checker) # ( . --> . ) Throws error on wrong stack state r> dup @ swap 1+ 2 ($ depth @0 < if "Stack size must be >= " @0 'str str-concat error endif @0 0 do @1 i + @ marker? not if i 1+ pick != if "Unexpected value on stack, must be " @1 i + @ 'str " at pos. " i 'str str-concat str-concat str-concat error endif endif loop @1 @0 + >r $) ; [/code]
Там же примеры использования
[code]: test-1 # Only 1 2 3 4 on top of stack will be accepted with test1 (presently: 1 2 3 4 ) . . . . ;
: test-2 # 'test2' requires 6 parameters on stack, with 100 on top and "three" at index 3 (presently: a b "three" c d 100 ) . . . . . . ; [/code]
|
|
|
|
Добавлено: Вс июн 06, 2010 16:47 |
|
|
|
|
|
Заголовок сообщения: |
Re: Задача : отладочное слово |
|
|
rmammoth писал(а): Решение здесь: viewtopic.php?f=9&p=27783#p27783, правда, не совсем честное, так как возникло при обсуждении расширений Форта и использует их. если б система была доступна - то чем оно не совсем честное? Цитата: 7) обязательно указание на форт-систему, для которой написан код; версию системы. В случае уникальности форт-системы обязательна прямая ссылка, по которой она может быть найдена. это из правил
[quote="rmammoth"]Решение здесь: http://fforum.winglion.ru/viewtopic.php?f=9&p=27783#p27783, правда, не совсем честное, :) так как возникло при обсуждении расширений Форта и использует их.[/quote] если б система была доступна - то чем оно не совсем честное?
[quote]7) обязательно указание на форт-систему, для которой написан код; версию системы. В случае уникальности форт-системы обязательна прямая ссылка, по которой она может быть найдена.[/quote]это из [url=http://fforum.winglion.ru/viewtopic.php?f=19&t=719]правил[/url]
|
|
|
|
Добавлено: Сб июн 05, 2010 08:02 |
|
|
|
|
|
Заголовок сообщения: |
Re: Задача : отладочное слово |
|
|
Решение здесь: viewtopic.php?f=9&p=27783#p27783, правда, не совсем честное, так как возникло при обсуждении расширений Форта и использует их.
Решение здесь: http://fforum.winglion.ru/viewtopic.php?f=9&p=27783#p27783, правда, не совсем честное, :) так как возникло при обсуждении расширений Форта и использует их.
|
|
|
|
Добавлено: Сб июн 05, 2010 02:04 |
|
|
|
|
|
Заголовок сообщения: |
Задача : отладочное слово |
|
|
создать слово (presently: которое является одновременно и комментарием и отладочным словом : (presently: ( -- ) и работает так открывает собою скобку как в комментариианализирует количество параметров в скобках и сопоставляет с реальным положением дел на стеке ПРИМЕР (presently: а в с -1 ) если на стеке лежит 4 значения, верхнее из которых -1 - ведёт себя как комментарий, который заканчивается скобкой (ничего не делает) если же число параметров не совпадает или если правый параметр не равен -1 - выдаёт предупреждение или останавливает исполнение (в зависимости от флага) Также пропускает строки в кавычках, чтобы можно было (presently: а в с " флаг = " -1 )и слово по-прежнему насчитывало в скобках 4 параметра, а программист мог читать более содержательные комментарии если параметр задан символическим значением, то просто учитывает его в количество, если числом - сравнивает (presently: 1 2 3 4 )должно выдать предупреждение, если реальное положение дел на стеке ( 1 2 2 4 )а вот (presently: 1 2 ad 4 ) удовлетворится числом параметров и тем, что 1 2 и 4 совпали ( ad ни с чем сравниваться не будет) также слово должно давать возможность отключить его, если все хорошо и нужна компиляция без засорения кода Использование: разумеется, к слову на стеке может приходить разное число параметров (в разных ветвлениях) , поэтому использование слова ограничено здравым смыслом, но, думаю, удобно: просто пишем комментарий, который помогает нам читать исходник, он вдруг по ходу оказывается ещё и тестирующим словом. У меня есть несколько вариантов слов с похожим действием, но каждое для своего форта. Интересно - как достичь универсального решения. Разумеется, идею можно развивать... (presently... 1 2 3 4 ) может значить : не менее 4, из которых последние 1 2 3 4 (presently... а а 3 а ) может значить : не менее 4, из которых предпоследняя 3 но это уже сложнее
создать слово (presently: которое является одновременно и комментарием и отладочным словом : [b](presently: [/b]( -- ) и работает так [size=85]открывает собою скобку как в комментарии[/size] анализирует количество параметров в скобках и сопоставляет с реальным положением дел на стеке ПРИМЕР [b](presently: а в с -1 )[/b] если на стеке лежит 4 значения, верхнее из которых -1 - ведёт себя как комментарий, который заканчивается скобкой (ничего не делает) если же число параметров не совпадает или если правый параметр не равен -1 - выдаёт предупреждение или останавливает исполнение (в зависимости от флага) Также пропускает строки в кавычках, чтобы можно было [b](presently: а в с " флаг = " -1 )[/b] и слово по-прежнему насчитывало в скобках 4 параметра, а программист мог читать более содержательные комментарии
если параметр задан символическим значением, то просто учитывает его в количество, если числом - сравнивает
[b] (presently: 1 2 3 4 )[/b] должно выдать предупреждение, если реальное положение дел на стеке [i]( 1 2 2 4 )[/i] а вот [b](presently: 1 2 [color=#808040]ad[/color] 4 ) [/b] удовлетворится числом параметров и тем, что 1 2 и 4 совпали ( ad ни с чем сравниваться не будет)
также слово должно давать возможность отключить его, если все хорошо и нужна компиляция без засорения кода
Использование: разумеется, к слову на стеке может приходить разное число параметров (в разных ветвлениях) , поэтому использование слова ограничено здравым смыслом, но, думаю, удобно: просто пишем комментарий, который помогает нам читать исходник, он вдруг по ходу оказывается ещё и тестирующим словом. У меня есть несколько вариантов слов с [i]похожим[/i] действием, но каждое для своего форта. Интересно - как достичь универсального решения. [size=50]Разумеется, идею можно развивать... (presently[b]...[/b] 1 2 3 4 ) может значить : не менее 4, из которых последние 1 2 3 4 (presently... а а 3 а ) может значить : не менее 4, из которых предпоследняя 3[/size] но это уже сложнее :)
|
|
|
|
Добавлено: Сб май 22, 2010 22:41 |
|
|
|
|