Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 14:00

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: testing
СообщениеДобавлено: Сб окт 14, 2006 22:03 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Код:
\ Автоматическое тестирование библиотек, кода.
\ 14-10-2006 written by mOleg for SPF4.17
\ -- слова, которых не хватает в СПФ

\ то же что и : только имя приходит на вершине стека данных в виде строки
\ со счетчиком:   S" name" S: код слова ;
: S: ( asc # --> ) SHEADER ] HIDE ;

\ берем очередную лексему до тех пор, пока не конец потока
\ в случае окончания потока возвращаем 0 0 вместо строки и ее длинны
\ полезная идея взята из СМАЛ32.
: iNextWord ( --> asc # )
            NextWord

            DUP IF EXIT ELSE 2DROP THEN

            REFILL IF RECURSE   \ здесь можно было бы просто NextWord
                    ELSE 0 0
                   THEN ;

\ зря этого слова нет в СПФ
: IS POSTPONE TO ; IMMEDIATE

\ ---------------------------------------------------------------------------

\ все слова кроме интерфейсных прячем в отдельный словарь
VOCABULARY tests
           ALSO tests DEFINITIONS

\ векторизация этих слов позволяет просто расширять набор инструментов
USER-VECT is-delimiter
USER-VECT action

\ основной цикл
: process ( --> )
          BEGIN iNextWord DUP WHILE
                2DUP is-delimiter WHILE
               action
           REPEAT 2DROP EXIT
          THEN CR ." test section not finished" CR ABORT ;

\ можно сделать просто переменную, но мне хочется, чтобы тестирование
\ производилось в том случае, если в текущем словаре найдено слово testing
: ?testing ( --> flag )
      S" testing" GET-CURRENT SEARCH-WORDLIST
      IF DROP TRUE
       ELSE FALSE
      THEN ;

\ ---------------------------------------------------------------------------

\ имя, которое оканчивает тестовую секцию
: test-delimiter  ( --> asc # ) S" ;test" ;

\ так быстрее, чем каждый раз искать в словарях ограничитель через SFIND
: is-test-delimiter ( asc # --> false|nfalse ) test-delimiter COMPARE ;

\ а это другая альтернатива 8)
: work-delimiter    ( --> asc # ) S" ;work" ;
: is-work-delimiter ( asc # --> false|nfalse ) work-delimiter COMPARE ;

\ ---------------------------------------------------------------------------

        PREVIOUS DEFINITIONS
                 ALSO tests

\ во время тестирования весь текст между ограничителями интерпретируется
\ или пропускается.
\ Можно использовать внутри определений!
: test: ?testing IF    ['] EVAL-WORD IS action
                  ELSE ['] 2DROP IS action
                 THEN
        ['] is-test-delimiter IS is-delimiter
        process ; IMMEDIATE

\ если ограничитель встречен во входном потоке, то значит по каким-то
\ причинам пропущено начало секции тестирования
test-delimiter S: CR ." testing delimiters unpaired!" ABORT ; IMMEDIATE

\ проходят действия обратные тестированию, то есть во время тестирования
\ данная секция выполняться не будет! но в другое время будет.
: work: ?testing IF    ['] 2DROP IS action
                  ELSE ['] EVAL-WORD IS action
                 THEN
        ['] is-work-delimiter IS is-delimiter
        process ; IMMEDIATE

work-delimiter S: CR ." working delimiters unpaired!" ABORT ; IMMEDIATE

        PREVIOUS

\EOF                     ДЛЯ ЧЕГО ЭТО НАДО

        Я предлагаю в каждую библиотечку вставлять код для автоматической
проверки ее работоспособности. Таким образом можно автоматически проверять
работоспособность всех библиотек, входящих в дистрибутив СПФа, да и самого
СПФа. Соответственно придется написать скрипт, который будет перебирать
все либы в .\devel\~??? и автоматически их подключать. Ошибка же себя сразу
покажет 8). К тому же данный подход можно использовать для автоматической
генерации версий кода, различных алгоритмов.
Ну и много других применений можно найти.

        Место в котором будет проводиться тестирование, а так же состояние
переменной state не влияет на работоспособность процесса. То есть можно
вставлять пары tеst: ;tеst и внутрь определений, а можно использовать
отдельно для работы в режиме интерпретации. Вложение пар tеst: ;tеst не
предусматривается так как в отличие от СМАЛ32 у слов нет признака immediatest,
но пары tеst wоrk могут чередоваться и быть вложенными друг в друга.



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 15, 2006 13:02 
А как просиходит проверка -- через поиск слов, определения которых отсутсвуют в подключаемых словарях, так?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 15, 2006 18:29 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Я предлагаю сделать просто отдельный файл, который будет по очереди подключать либы из папки .\devel\~ , а после забывать их. То есть через mark-еры
а вот само тестирование должна обеспечивать сама библиотека, причем тестирующий код будет заключен между парами слов

test:
тут
тестовый
код
;test
Соответственно при возникновении ошибки процесс тестирования остановится и мы увидим место, где тест не прошел. Хотя сюда можно сделать и логи... (надо будет подумать)

А при нормальном подключении код между test: ;test будет просто игнорироваться. В ближайшее время оформлю какую-нибудь свою либу и выложу на общий обзор. Чтобы начался режим тестирования в текущем словаре( то есть CURRENT) должно просто находиться слово с именем testing

если есть какие-то предложения и идеи готов выслушать, впрочем, как и замечания 8)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн окт 16, 2006 12:13 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
я так понимаю, что мы говорим о регресивном тестировании, верно? Т.е проверяем сам факт успешной компиляции...

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн окт 16, 2006 14:11 
AlexF писал(а):
В идеале, было бы логичнее, каждую бибилиотеку снабжать проверочным кодом. Это нечто похожее на слово Test но должно само при запуске отвечать, тест проходит или нет. Другими словами, это набор характерных тест-кейсов, с автоматической проверкой. Таким образом проверяется и коректность функционирования и, соответсвенно, корректность компилирования.
Можно подсмотреть, например, как это сделано в Perl. Там при инсталляции библиотеки выполняется проверочное тестирвоание. И оттуда же хорошая идея -- если автор библиотеки хочет ее широкого использования он (автор) оформляет библиотеку согласно принятому стандарту.

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
AlexF писал(а):
я так понимаю, что мы говорим о регресивном тестировании, верно? Т.е проверяем сам факт успешной компиляции..


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

Именно об этом и идет речь!
Я предлагаю добавлять тестовый код внутрь секций test: ;test и он будет автоматически подключаясь тестировать работоспособность либы.

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

Об этом стоило бы завести речь в отдельном топике!
Я уже поднимал в ирке эту тему, но там меня "запинали ногами"
Я тоже предлагаю выработать требования к создателям либ, и правильно оформленные либы добавлять в одну папку, а неправильно в другую с соответствующими коментариями.


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

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

\ Автоматическое тестирование библиотек, кода.
\ 14-10-2006 written by mOleg for SPF4.17

\ секция настроек -----------------------------------------------------------

\ внимание: один из Create всегда должен быть раскомментирован !!!

CREATE russian   \ сообщения на русском языке
\ CREATE english   \ select english messages

\ если хотим тестировать эту либу и все последующие
CREATE testing

\ -- слова, которых не хватает в СПФ ----------------------------------------

\ то же что и : только имя приходит на вершине стека данных в виде строки
\ со счетчиком:   S" name" S: код слова ;
: S: ( asc # --> ) SHEADER ] HIDE ;

\ берем очередную лексему до тех пор, пока не конец потока
\ в случае окончания потока возвращаем 0 0 вместо строки и ее длинны
\ полезная идея взята из СМАЛ32.
: iNextWord ( --> asc # )
            NextWord

            DUP IF EXIT ELSE 2DROP THEN

            REFILL IF RECURSE   \ здесь можно было бы просто NextWord
                    ELSE 0 0
                   THEN ;

\ зря этого слова нет в СПФ
: IS POSTPONE TO ; IMMEDIATE

\ ---------------------------------------------------------------------------

\ все слова кроме интерфейсных прячем в отдельный словарь
VOCABULARY tests
           ALSO tests DEFINITIONS

\ векторизация этих слов позволяет просто расширять набор инструментов
USER-VECT is-delimiter
USER-VECT action

\ основной цикл
: process ( --> )
          BEGIN iNextWord DUP WHILE
                2DUP is-delimiter WHILE
               action
           REPEAT 2DROP EXIT
          THEN CR ." test section not finished" CR ABORT ;

\ ищем слово идентифицируемое строкой в контексте
\ кстати, может в специальном словаре искать: каком-нибудь settings ?
: ?keyword ( asc " --> flag )
           SFIND
           IF DROP TRUE
            ELSE 2DROP FALSE
           THEN ;

\ ---------------------------------------------------------------------------

\ имя, которое оканчивает тестовую секцию
: test-delimiter  ( --> asc # ) S" ;test" ;

\ так быстрее, чем каждый раз искать в словарях ограничитель через SFIND
: is-test-delimiter ( asc # --> false|nfalse ) test-delimiter COMPARE ;

\ а это другая альтернатива 8)
: work-delimiter    ( --> asc # ) S" ;work" ;
: is-work-delimiter ( asc # --> false|nfalse ) work-delimiter COMPARE ;

\ а это поддержка коментариев в стиле СМАЛ32
: comm-delimiter    ( --> asc # ) S" comment;" ;
: is-comm-delimiter ( asc # --> false|nfalse ) comm-delimiter COMPARE ;

\ а это поддежка различных языков
: rus-delimiter     ( --> asc # ) S" ;rus" ;
: is-rus-delimiter ( asc # --> false|nfalse ) rus-delimiter COMPARE ;
: eng-delimiter     ( --> asc # ) S" ;eng" ;
: is-eng-delimiter ( asc # --> false|nfalse ) eng-delimiter COMPARE ;

\ ---------------------------------------------------------------------------

        PREVIOUS DEFINITIONS
                 ALSO tests

\ во время тестирования весь текст между ограничителями интерпретируется
\ или пропускается.
\ Можно использовать внутри определений!
: test: S" testing" ?keyword
         IF    ['] EVAL-WORD IS action
          ELSE ['] 2DROP IS action
         THEN
        ['] is-test-delimiter IS is-delimiter
        process ; IMMEDIATE

\ если ограничитель встречен во входном потоке, то значит по каким-то
\ причинам пропущено начало секции тестирования
test-delimiter S: CR ." testing delimiters unpaired!" ABORT ; IMMEDIATE


\ проходят действия обратные тестированию, то есть во время тестирования
\ данная секция выполняться не будет! но в другое время будет.
: work: S" testing" ?keyword
         IF    ['] 2DROP IS action
          ELSE ['] EVAL-WORD IS action
         THEN
        ['] is-work-delimiter IS is-delimiter
        process ; IMMEDIATE

work-delimiter S: CR ." working delimiters unpaired!" ABORT ; IMMEDIATE


\ поддержка коментариев в стиле СМАЛ32
: comment: ['] 2DROP IS action
           ['] is-comm-delimiter IS is-delimiter
           process ; IMMEDIATE

comm-delimiter S: CR ." comments unpaired!" ABORT ; IMMEDIATE


\ поддержка языков
: rus:  S" russian" ?keyword
         IF    ['] EVAL-WORD IS action
          ELSE ['] 2DROP IS action
         THEN
        ['] is-rus-delimiter IS is-delimiter
        process ; IMMEDIATE

: eng:  S" english" ?keyword
         IF    ['] EVAL-WORD IS action
          ELSE ['] 2DROP IS action
         THEN
        ['] is-eng-delimiter IS is-delimiter
        process ; IMMEDIATE

rus-delimiter S: CR ." пропущено начало секции rus!" ABORT ; IMMEDIATE
eng-delimiter S: CR ." eng section start is missed!" ABORT ; IMMEDIATE

        PREVIOUS

comment:                     ДЛЯ ЧЕГО ЭТО НАДО

        Я предлагаю в каждую библиотечку вставлять код для автоматической
проверки ее работоспособности. Таким образом можно автоматически проверять
работоспособность всех библиотек, входящих в дистрибутив СПФа, да и самого
СПФа. Соответственно придется написать скрипт, который будет перебирать
все либы в .\devel\~??? и автоматически их подключать. Ошибка же себя сразу
покажет 8). К тому же данный подход можно использовать для автоматической
генерации версий кода, различных алгоритмов.
Ну и много других применений можно найти.

        Место в котором будет проводиться тестирование, а так же состояние
переменной state не влияет на работоспособность процесса. То есть можно
вставлять пары tеst: ;tеst и внутрь определений, а можно использовать
отдельно для работы в режиме интерпретации. Вложение пар tеst: ;tеst не
предусматривается так как в отличие от СМАЛ32 у слов нет признака immediatest,
но пары tеst wоrk могут чередоваться и быть вложенными друг в друга.


16-10-2006. добавилась поддержка коментариев в стиле СМАЛ32. Собственно
             сейчас вы читаете секцию коментария.
17-10-2006. добавились секции rus: ;rus eng: ;eng текст из этих
             секций будет интерпретироваться лишь в случае, если
             в контексте будет найдено слово russian или слово english.
             Соответственно, наличие обоих ключевых слов приведет
             к интерпретации кода из двух этих секций.


comment;

        ALSO tests DEFINITIONS

        0 VALUE marker  \ запоминаем глубину стека
        0 VALUE tester  \ запоминаем глубину стека 8)

\ в какую сторону направлен дисбаланс стека?
: ?where ( delta --> )
         0< IF  rus: ." На стеке оставлены лишние значения" ;rus
                eng: ." Data stack overflow." ;eng
             ELSE
                rus: ." Cо стека сняты лишние значения" ;rus
                eng: ." Data stack underflow." ;eng
            THEN ;

\ проверяем, не было ли изменений на стеке
: ?changes ( 0x --> flag )
           tester marker - CELL / DUP >R >R
           BEGIN R> 1- DUP WHILE >R
                       0=  WHILE
            REPEAT rus: ." Изменения на вершине стека данных " ;rus
                   eng: ." data stack contents is changed " ;eng
                   2R> -

                   rus: ." изменено " . ." -ое значение." ;rus
                   eng: . ." -th value changed." ;eng

                   EXIT
           THEN RDROP RDROP
           ." √" ;

\ есть ли изменения на стеке?
: ?violations ( --> )
              SP@ marker - DUP
              IF ?where
               ELSE DROP ?changes
              THEN ;


        0 VALUE standoff \ отражает вложенность либ во время included

        PREVIOUS DEFINITIONS
                 ALSO tests

\ ---------------------------------------------------------------------------

\ определяем собственный included
: INCLUDED ( asc # --> )
           0x0D EMIT standoff DUP SPACES 3 + TO standoff

           2>R  SP@ TO tester
            0 0 0 0 0 0 0 0 0 0
           SP@ TO marker

           2R> ." including: " 2DUP TYPE 5 SPACES

           ['] (INCLUDED) CATCH

         standoff 3 - 0 MAX TO standoff

           IF rus: ." Проблемы со сборкой либы." CR ;rus
              eng: ." Can't make the library."   CR ;eng
              ERR-STRING TYPE

            ELSE ?violations
           THEN

    tester SP!
    0x0A EMIT ;

        PREVIOUS

\ взято из пакета СПФ.
: MARKER ( "<spaces>name" -- ) \ 94 CORE EXT
         HERE
         GET-CURRENT ,
         GET-ORDER DUP , 0 ?DO DUP , @ , LOOP
         CREATE ,
         DOES> @ DUP \ ONLY
         DUP @ SET-CURRENT CELL+
         DUP @ >R R@ CELLS 2* + 1 CELLS - R@ 0
         ?DO DUP DUP @ SWAP CELL+ @ OVER ! SWAP 2 CELLS - LOOP
         DROP R> SET-ORDER
         DP ! ;

\ ---------------------------------------------------------------------------

\ теперь все, что хотим протестировать, но при этом, хотим чтобы не
\ осталось в форт-системе, подключаем этим словом.
: testlib ( asc # --> )
          S" MARKER remove " EVALUATE
          INCLUDED
          S" remove" EVAL-WORD ;



comment:
        теперь для тестирования библиотеки достаточно ее подключить с
помощью S" path\name" testlib. Во время сборки библиотечки ее тестирование
вестись будет лишь в случае, если автор либы это предусмотрел. Но кроме
этого контролируются ситуации, когда после подключения библиотечки
наблюдается дисбаланс на стеке данных: переполнение\переопустошение либо
изменение стека на определенную глубину ( если нужно отслеживать изменение
стека на большую, чем сейчас глубину(10 ячеек), необходимо увеличить кол-во
нулей в included. После подключения весь скомпилированный код удаляется.
comment;

\ ---------------------------------------------------------------------------

test: \ автоматически себя тестируем, если присутствует соответствующий ключ

S" .\lib\include\core-ext.f" testlib
S" .\lib\include\double.f"   testlib
S" .\lib\include\string.f"   testlib
S" .\lib\include\tools.f"    testlib
S" .\lib\include\facil.f"    testlib

;test



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

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

Существует необходимость при изменениях ядра СПФ производить тестирования все наработок.
Самым простым ( но достаточно трудоемким ) вариантом рещения данной задачи можно считать ручное тестирование. Но есть такое понятие лень... А либ становится все больше.

Конечно можно обязать авторов библиотек каждый раз проверять свои либы самим, но это достаточно сложно и достаточно долго. Проще было бы создать инструмент, который по ряду признаков будет выявлять неработоспособные либы и тогда уж браться за их авторов( ну или за либы ).

Я предлагаю пойти сразу по двум путям решения проблемы.
Во-первых, создать инструментарий, который позволит авторам при написании и отладке либы закладывать в ее код методику тестирования, который будет срабатывать при определенном условии - в моем случае этим условием является ключевое слово testing. Выглядеть это должно примерно так:
Код:
: Something  a b c
                     test: DUP CR ." at this moment we must see XXXX "  .  ;test 
                     d e f ;
или так:

test:  S" some date" Somthing TYPE 
         S" another date " Someother . 
;test

при этом в случае простого подключения либы код между test: ;test будет игнорироваться.
то есть в код включаться не будет.

Второй подход - это пассивное тестирование либ во время подключения. При этом можно контролировать как возможность компиляции самого файла, так и наличие некоторых нарушений сборки, которые не приводят к улету, по крайней мере сразу 8)
Речь идет изменение состояние стека после сборки либы:
- снято лишнее значение(я) со стека
- оставлено лишнее значение(я) на стеке
- изменено несколько значений на стеке без изменения баланса стека
все это поймать достаточно просто. И все это уже реализовано мной в приведенной выше либе для СПФ версии 4.17.

достаточно сделать так:

CREATE testing

S" lib-path\lib-name" INCLUDED
\ при этом будет lib-name подключен, и проверен на "вшивость" пассивным образом
\ и скомпилированный код останется в системе

либо же
S" lib-path\lib-name" testlib
\ будет сделано то же, что и с included но код в системе не останется.

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

У второго варианта недостаток в том, что scattered colon слова будут валить систему.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 18, 2006 14:39 
У меня два типа замечаний: придирки по реализации (это в принципе не важно и сильно субьективно), и по собственно целям библиотеки...

Код:
rus: ." Проблемы со сборкой либы." CR ;rus
eng: ." Can't make the library."   CR ;eng

Это что же, для каждого языка надо будет отдельно компилировать разные программы?.. А если язык не русский, и не английский? Для локализаций сообщений есть гораздо более удобные для пользователей способы (вроде тех же lng-файлов).

А если это сделано для написания программ на обоих языках, то тогда я уже не понимаю зачем объединять одном файле обе версии... Зачем заставлять одноязычных с каждой стороны читать целую половину файла на чужом языке? Плюс ещё им в обязательном порядке придётся ставить эти флаги, для того чтобы определять язык компилирования библиотеки.

Цитата:
Существует необходимость при изменениях ядра СПФ производить тестирования все наработок.
Самым простым ( но достаточно трудоемким ) вариантом рещения данной задачи можно считать ручное тестирование. Но есть такое понятие лень… А либ становится все больше.
...
Я предлагаю пойти сразу по двум путям решения проблемы...
...
Код:
CREATE testing

S" lib-path\lib-name" INCLUDED
\ при этом будет lib-name подключен, и проверен на "вшивость" пассивным образом
\ и скомпилированный код останется в системе

либо же
S" lib-path\lib-name" testlib
\ будет сделано то же, что и с included но код в системе не останется.

...

Это не два пути решения одной проблемы, это две разные (пусть и зависимые) проблемы:
1. Собираемость (компилируемость) исходных файлов, зависит от наличия тех или иных слов в системе, и корректности IMMEDIATE-кода.
2. Корректность самого исполнения. Зависит вообще от всего, включая фазы Луны, тараканов в голове у программиста и последних изменений в ядре SPF. Причём без прохождения первого пункта, ко второму мы приступить не можем.

Чтобы быть уверенным в полной работоспособности библиотеки оба пункта должны быть пройдены успешно.

На данный момент автоматически проверять 2-й пункт невозможно, так как для этого нужно принудить, обязать, дооформить в конце концов самому кучу тестового кода, который сейчас у большинства программистов спрятан за \EOF.

Тогда как первую проблему на автоматику взвалить вполне можно и сейчас.

С этой точки зрения, мне нравятся твои "перестраховочные слова" ?changes, ?where во второй половине библиотеки.

Кстати, щас тестовый код у большинства выглядит примерно так:

Код:
: TEST S" test" ;
" abc{TEST}123 5+5={5 5 +} Ok" STYPE CR

И тут бы хорошо для проверки корректности работы сделать что-то вроде:
Код:
>>> abctest 5+5=10

Где слово >>> должно проверять последний (?) вывод на соответствие строке. По-другому переписывать тестовые примеры достаточно сложно.

Теперь мелочные придирки по реализации:

Почему-то мне не прекращает не нравиться парсер process. Ты говорил что это не парсер... А мне вот почему-то кажется, что если что-то выглядит как парсер, действует как парсер, написан как парсер, и используется как парсер, то наверное это действительно немножко парсер?..

Ведь можно сделать проще, через словари:

Код:
VOCABULARY tests:
           ALSO tests DEFINITIONS
: ;test PREVIOUS ;
: NOTFOUND 2DROP ;
PREVIOUS DEFINITIONS


work: и test: напрашиваются на рефакторинг...

А MARKER специально определён в самой библиотеке (а не взят из lib\include\core-ext.f), чтобы не зависеть от других библиотек, ну, в смысле чтобы оградить её от возможных там глюков?..

Резюме:
1. Придирка: мне не нравится свой парсер, потому что можно сделать проще.
2. Предложение: хорошо бы слово ">>>".


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 18, 2006 16:06 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
profiT писал(а):
С этой точки зрения, мне нравятся твои "перестраховочные слова" ?changes, ?where во второй половине библиотеки.

Кстати, щас тестовый код у большинства выглядит примерно так:

Код:
: TEST S" test" ;
" abc{TEST}123 5+5={5 5 +} Ok" STYPE CR

И тут бы хорошо для проверки корректности работы сделать что-то вроде:
Код:
>>> abctest 5+5=10

Где слово >>> должно проверять последний (?) вывод на соответствие строке. По-другому переписывать тестовые примеры достаточно сложно.

Кстати подобное есть в samples/ans/tester.f
И строку можно проверять COMPARE 0 =

_________________
http://forth.org.ru/~ygrek


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT, спасибо за обстоятельный ответ!
profiT писал(а):
У меня два типа замечаний: придирки по реализации (это в принципе не важно и сильно субьективно), и по собственно целям библиотеки...

Код:
rus: ." Проблемы со сборкой либы." CR ;rus
eng: ." Can't make the library." CR ;eng

Это что же, для каждого языка надо будет отдельно компилировать разные программы?.. А если язык не русский, и не английский? Для локализаций сообщений есть гораздо более удобные для пользователей способы (вроде тех же lng-файлов).

вообще эта вещь не предназначена для тестирования, просто пришло в голову что можно сделать и так. К тому же это хорошо совмещается с другой моей либой(я имею ввиду идеалогически) messages.f ну и еще сразу наличие наглядного примера.
Что же касается более чем двуязычных программ, то ведь обычно они как раз двуязычны 8) то есть обычно английский + какой-то-другой-язык. Кроме того фразы могут строиться различным образом, а мой вариант позволяет фразу строить произвольным образом. вообще оформлять зависящие от языка места для каждого случая так, как хочется, не оглядываясь на номер строки в lng.
Но это другой разговор.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
Это не два пути решения одной проблемы, это две разные (пусть и зависимые) проблемы:
1. Собираемость (компилируемость) исходных файлов, зависит от наличия тех или иных слов в системе, и корректности IMMEDIATE-кода.
2. Корректность самого исполнения. Зависит вообще от всего, включая фазы Луны, тараканов в голове у программиста и последних изменений в ядре SPF. Причём без прохождения первого пункта, ко второму мы приступить не можем.

Чтобы быть уверенным в полной работоспособности библиотеки оба пункта должны быть пройдены успешно.

Согласен.
profiT писал(а):
На данный момент автоматически проверять 2-й пункт невозможно, так как для этого нужно принудить, обязать, дооформить в конце концов самому кучу тестового кода, который сейчас у большинства программистов спрятан за \EOF.

достаточно \EOF заменить на test: ну и в конце поставить ;test

profiT писал(а):
Кстати, щас тестовый код у большинства выглядит примерно так:

Код:
: TEST S" test" ;
" abc{TEST}123 5+5={5 5 +} Ok" STYPE CR

И тут бы хорошо для проверки корректности работы сделать что-то вроде:
Код:
>>> abctest 5+5=10

Где слово >>> должно проверять последний (?) вывод на соответствие строке. По-другому переписывать тестовые примеры достаточно сложно.

это идея. Сделать можно достаточно просто, только как такой синтаксис:

test~ 5 5 + . ~test

profiT писал(а):
Теперь мелочные придирки по реализации:

Почему-то мне не прекращает не нравиться парсер process. Ты говорил что это не парсер... А мне вот почему-то кажется, что если что-то выглядит как парсер, действует как парсер, написан как парсер, и используется как парсер, то наверное это действительно немножко парсер?..


Это все-таки не совсем парсер. Это слово просто отфильтровывает ненужные лексемы. Парсером это не является, так как не принимает никакого участия в разборе исполняемой строки. Например, если встретится такой код:

." something to show " process выделит первую лексему= ." а ." как обычно сам найдет строку и т.д. при этом я вообще ничего не меняю. Если же задуматься о словарной реализации, то мне кажется, что это будет более медленный и потенциально более глючный вариант. в любом случае придется где-то сохранять контекст. А если ошибка возникнет?
Кстати только сейчас задумался, что стоит за одно сделать контроль контекста и текущего словаря. Лично для меня это распространенная ошибка - забыть в контексте лишний словарь. Но тут тоже могут быть варианты.

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

profiT писал(а):
Ведь можно сделать проще, через словари:

Код:
VOCABULARY tests:
ALSO tests DEFINITIONS
: ;test PREVIOUS ;
: NOTFOUND 2DROP ;
PREVIOUS DEFINITIONS

все-таки это не проще. Если бы notfound выполнялся для каждого словаря в отдельности - это была бы идея. а так придется делать больше действий, чем есть сейчас. Вобщем буду думать.

profiT писал(а):
А MARKER специально определён в самой библиотеке (а не взят из lib\include\core-ext.f), чтобы не зависеть от других библиотек, ну, в смысле чтобы оградить её от возможных там глюков?..

маркер глючен и так. Взято из core-ext чтобы его не подключать либы из вне, чтобы все было под рукой.

Вобщем спасибо за большой коментарий! Буду работать дальше


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

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
харошая идея, при падгрузке библиотки получать отчет о её работоспасобности,
надо для себя принять за правило

_________________
SPF


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
mrack писал(а):
харошая идея, при падгрузке библиотки получать отчет о её работоспасобности,
надо для себя принять за правило


Только все-таки не при подгрузке, а при тестировании.
То есть конечно подгрузка, но с определенным флагом и вариантов два - при одном либа после подгрузки забыватеся 8)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 17, 2007 13:29 
Возвращаясь к теме...

Но, сначала, замечание не в тему (потому что если ставить такие замечания в конец, то по принципу фон Штирлица ["запоминается последняя фраза" (с)], из всего сообщения усвоят только его, и будет риск разрушения темы):
mOleg писал(а):
Если бы notfound выполнялся для каждого словаря в отдельности - это была бы идея.

Вообще-то NOTFOUND как раз выполняется для каждого словаря в отдельности:

Код:
WORDLIST CONSTANT myVoc
{{ myVoc DEFINITIONS
: NOTFOUND ." bla-bla" NOTFOUND ;
}}

1 .

{{ myVoc  1 . }}


Без этого я бы не смог временно включать обработку символьных литералов из GForth (вида 'A) для FWiki...

Так вот, по теме... Я тут подумал, и:
Код:
: /TEST INCLUDE-DEPTH @ 1 = 0= IF \EOF THEN ;


Тогда, при запуске самой библиотеки мы будем получать примеры спрятанные за /TEST , а при запуске программы использующей библиотеку примеры запускаться не будут.

Тут правда, встаёт вопрос с вызовами вида:

Код:
spf4.exe ~ac/lib/str4.f lib/ext/locals.f ...


Далее, для дооформления примеров пока использую:

Код:
: >>  0 WORD COUNT CR 2DUP TYPE CR EVALUATE ;


Тогда типичный пример примерно будет выглядеть примерно так:

Код:
>> 10 FACT .


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

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


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

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


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

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