Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 22:05

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8 ... 10  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 10, 2009 22:30 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
табуляторы невидимы, кроме того, не всем они по душе (я терпеть не могу, когда курсор скачет далеко).
Программа, использующая табуляторы, или, к примеру, распространенное в фортране явление, когда распознаются значения стоящие в определенных местах строки, и не дай боже съехать на один символ в сторону, так вот, такие программы дают глюки в самых непредвиденных случаях.
Но по крайней мере понятно, почему для моего алгоритма табуляторы так важны и что там делают?

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
mOleg писал(а):
табуляторы невидимы, кроме того, не всем они по душе (я терпеть не могу, когда курсор скачет далеко).
Программа, использующая табуляторы, или, к примеру, распространенное в фортране явление, когда распознаются значения стоящие в определенных местах строки, и не дай боже съехать на один символ в сторону, так вот, такие программы дают глюки в самых непредвиденных случаях.

Вот-вот! Я вот немного игрался с питоном - так там ветвление и циклы необходимо "выдвигать" табами вправо, иначен не будет работать.

Итак, вот моё решение поставленной задачи - немного медлительное, зато выдаваемую строку можно прочитать и есть тригонометрические функции 8) .
Написано на кварке(http://www.msyst.ru/quark).
Код:
\  Преобразовать выражение вида a=b*(c+d)/e в постфиксную запись вида c d + b * e / a =
\  На входе дана az-строка, представляемая своим адресом, в которой находится
\  арифметическое выражение, записанное в инфиксной форме.

\ Автор:    VoidVolker
\ Дата:     21:31/10.01.09

\ Примеры:
\ " (a^5*b+c)^3/(cos((d-e)^4)*(f+g))+h*i/j^2" >postfix PRINT CR
\ " first*2-4*second+(sin(x)|b)" >postfix PRINT CR
\ " a=2*sin(a/2)*cos(a/2)/(cos(a/2)^2+sin(a/2)^2)" >postfix PRINT CR

CLS
: 2SWAP  ROT >R ROT R> ;
: TYPE   \ ( a u -- )
  OVER + SWAP DO  I C@ EMIT  LOOP
;

: 2>L   >L >L ;
: 2L>   L> L> ;

: PROC:   \ Начать определение нового слова с именем, взятым из входного потока. Во время выполнения слово оставит на стеке указатель на свой код.
  QUAN [C]HERE [C]HERE 0xA - ! ]
;

: ZLEN
  >R 0 BEGIN R@ OVER + C@ WHILE 1+ REPEAT  RDROP
;

: Z>AU  DUP ZLEN ;

: CHAR   PARSE C@ ;
: [CHAR]   PARSE C@ LIT, ; IMMEDIATE
: CNT@   4 - @ ;
: CNT!   4 - ! ;

: ANDS   \ ( ?n ... ?1 n -- ? )
  1- DUP IF  0 DO AND LOOP  ELSE  DROP  THEN
;

: ERASE  \ ( a len -- )
  0 ROT ROT CFILL
;

1 CELLS CONSTANT CELL


CREATE результат 256 ALLOT

: число-слов   \ ( str -- n )
  0 >R BEGIN DUP C@ DUP WHILE
    33 < R> + >R
    1+
  REPEAT 2DROP
  R> ABS 1+
;

: Список(   HERE 0 , 0 CREATE ;
: )Список   SWAP ! 0 , ;
: \\   
  [COMPILE] LINE" DUP
  число-слов SWAP CNT!  \ Вместо длины строки записываем число слов в строке
  1+ 
;

: следующий-элемент   \ ( a1 -- a2 )
  CELL + BEGIN DUP C@ WHILE 1+ REPEAT 1+
;

: элемент   \ ( список D -- addr )
  DUP
    IF
      OVER CNT@ 1- MIN  \ Ограничиваем цикл числом элементов в списке
      0 DO  следующий-элемент  LOOP
    ELSE
      DROP
    THEN
  CELL +  \ пропускаем счетчик
;

\ |4б  счетчик_строк |
\ |4б счетчик | строка  |1б  0  |
\ ...
\ |4б 0 |

\ Несколько групп операторов: у каждой следующей группы более высокий приоритет; операторы в группе
\ разделены пробелом. Сначала в строке ищутся операторы из первой группы, затем из второй и так далее.
\ Считается, что у всех операторов только два аргумента.
Список( операторы[]
  \\ =
  \\ & | + -
  \\ < > ^ * /
)Список

\ 0 - порядок аргументов не имеет значения (отсутствует - хотелось сделать автосортировку)
\ 1 - тот же порядок что и в формуле
\ 2 - обратный порядок: т.е. сначала идет второй аргумент, потом первый

\ ' сортировать VALUE П0
' 2SWAP  VALUE П1
' NOOP   VALUE П2

CREATE порядок П2 , П1 , П1 , П1 , П1 , П1 , П1 , П1 , П1 , П1 ,

\ А это функции - аргумент необходимо заключать в скобки
" sin cos tg ctg" VALUE функции
функции число-слов функции CNT!


QUAN группа#    \ Номер текущей группы в списке операторов

QUAN строк
QUAN аргументов

: оператор#   \ ( a -- u ) \ Получить длину оператора
  DUP BEGIN
    1+ DUP C@ 33 <
  UNTIL
  SWAP -
;

: группа   \ ( -- az )  \ Возвращает строку с текущей группой
  операторы[] группа# элемент
;

QUAN фун#  \ Длина найденного оператора
QUAN фун   \ Адрес строки найденного оператора из группы оперторов

QUAN 1фун#
QUAN 1фун

: функция# оператор# ;

: в-скобках?   \ ( a u -- ? )
  0 ROT ROT
  OVER + 1- SWAP DO  \ Пока скобка не закроется - ноль не будет появляться
    I C@ CASE
      [CHAR] ( OF 1+ BREAK
      [CHAR] [ OF 1+ BREAK
      [CHAR] ) OF 1- BREAK
      [CHAR] ] OF 1- BREAK
    ENDCASE
    DUP IF ELSE DROP -1 THEN
  LOOP
  1-   \ Если крайние скобки в строке соответствуют друг-другу, то здесь будет ноль
  NOT
;

: функция?   \ ( a -- ? )
  >R 0 функции DUP CNT@ 0 DO  \ Цикл по числу слов
    \ ? addr
    DUP функция# SWAP OVER
    \ ? len addr len
    DUP TO 1фун# OVER TO 1фун
    0 DO \ ? len addr  \ А теперь каждое слово сравниваем со строкой
      DUP C@        \ получаем очередной символ слова
      R@ I + C@     \ и соответствующий символ в строке
      =             \ сравниваем символы
      ROT ROT       \ сохраняем результат сравнения на стеке
      1+            \ увеличиваем адрес
    LOOP \ ? ?n ... ?2 ?1 n addr
    1+   \ Пропускаем пробел
    >R ANDS DUP IF 1фун# TO фун# 1фун TO фун THEN
    OR R>
  LOOP
  DROP
  RDROP
;

: разобрать  \ ( a u -- a1 u1 a2 u2 )
  2DUP
  >R фун# + R> фун# -
  в-скобках?
    IF
     >R >R фун фун#
     R> фун# + 1+ R> фун# - 2 -
     1 +TO строк
    THEN
  \ R> фун# + 1+  \ Увеличиваем адрес
  \ R> фун# - 2 - \ и уменьшаем счетчик на длину названия функции и скобки(оддну и две соответственно)
;

: раскрыть-функцию   \ ( a u -- a u | a1 u1 a2 u2 )
  OVER функция? IF разобрать THEN
;


QUAN оп#  \ Длина найденного оператора
QUAN оп   \ Адрес строки найденного оператора из группы оперторов

QUAN 1оп#
QUAN 1оп

: оператор?   \ ( a -- ? ) \ Сравнивает строку со всеми операторами в текущей группе
  >R 0 группа DUP CNT@ 0 DO  \ Цикл по числу операторов в группе
    \ ? addr
    DUP оператор# SWAP OVER
    \ ? len addr len
    DUP TO 1оп# OVER TO 1оп
    0 DO \ ? len addr  \ А теперь каждое слово сравниваем со строкой
      DUP C@        \ получаем очередной символ слова
      R@ I + C@     \ и соответствующий символ в строке
      =             \ сравниваем символы
      ROT ROT       \ сохраняем результат сравнения на стеке
      1+            \ увеличиваем адрес
    LOOP \ ? ?n ... ?2 ?1 n addr
    1+   \ Пропускаем пробел
    >R ANDS DUP IF 1оп# TO оп# 1оп TO оп THEN
    OR R>
  LOOP
  DROP
  RDROP
;

QUAN скобки
\ QUAN модуль
QUAN найден?
: последний-оператор-есть?  \ ( a u -- a u  a1 u1 -1 | a u 0 )
  0 TO скобки  0 TO найден?
  \ 0 TO модуль
  0 TO группа#
  BEGIN
    2DUP + 1- OVER 0 DO  \ a u a
      DUP I - C@
      CASE
        [CHAR] ) OF  1 +TO скобки BREAK
        [CHAR] ( OF -1 +TO скобки BREAK
        [CHAR] ] OF  1 +TO скобки BREAK
        [CHAR] [ OF -1 +TO скобки BREAK
        \ [CHAR] | OF
            \ модуль IF 1 0 ELSE -1 -1 THEN
            \ TO модуль +TO скобки
          \ BREAK
        скобки
          IF ELSE
            найден?
              IF ELSE
                DUP I - оператор?
                  IF
                    DUP I - SWAP оп# SWAP
                    -1 TO найден? 0 TO скобки 
                    \ 0 TO модуль
                  THEN
              THEN
          THEN
      ENDCASE
    LOOP DROP
    найден?
    1 +TO группа#
    операторы[] CNT@ группа# = OR
  UNTIL
  \ найден?
    \ IF ROT DROP ROT DROP THEN
  найден?
;

: убрать-скобки  \ ( a u -- a1 u1 )
  OVER C@
  DUP [CHAR] ( =
  SWAP [CHAR] [ = OR
    IF
      2DUP + 1-
      C@ DUP [CHAR] ) =
      SWAP [CHAR] ] = OR
        IF \ А теперь пройдемся по всей строке и проверим, соответствуют ли крайние скобки друг-другу
          2DUP в-скобках?
          IF 2 - SWAP 1+ SWAP THEN
        THEN
    THEN
;

: номер-оператора   \ ( -- n )
  \ используем тот факт, что "оп" указывает на адрес текущего оператора в группе операторов
  0 операторы[] 4 + BEGIN  \ Пропускаем счетчик строки
    DUP оп = >R \ 0  a ?
    DUP C@
      IF
        DUP C@ 33 <
          IF >R 1+ R> THEN
      ELSE
        CELL + >R 1+ R>  \ Пропускаем счетчик строки
      THEN
    1+ R>
  UNTIL DROP
;

: получить   \ ( a2 u2 a3 u3 порядок -- xt )
  номер-оператора -TH @
;

: расположить
  порядок получить EXECUTE
;

: аргументы   \ ( a u a1 u1 -- a1 u1 a2 u2 a3 u3 )
  2SWAP >R
  FRAME{  \ a1 u1 a -- arg2 arg1 arg0  \ Спасибо Хищнику за такую удобную штуку ;)
    \ a2 = a
    ARG2 @ OVER -             \ u2 = a1-a2
    ARG2 @ ARG1 @ +           \ a3 = a1+u1
    OVER ARG1 @ + R> SWAP -   \ u3 = u-u2-u1
  }FRAME
;

: собрать-строку   \ ( an un ... a1 u1 -- )
  строк 0 DO
    результат результат ZLEN + 32 OVER C! 1+
    \ src len dest
    SWAP CMOVE
  LOOP
;

: инициализация
  результат 255 ERASE
  0 TO группа#
  0 TO оп#     
  0 TO оп
  0 TO 1оп#     
  0 TO 1оп
  0 TO строк   
  0 TO аргументов
;

0 CONSTANT продолжаем
-1 CONSTANT выход
     
: >postfix   \ ( str1 --> str2 )
  DUP ZLEN
  инициализация
  \ a u
  BEGIN
    убрать-скобки
    раскрыть-функцию
    последний-оператор-есть?
      IF
        1 +TO строк  \ Оставляем на стеке оператор - увеличиваем счетчик строк
        аргументы расположить
        2>L               \ один аргумент на локальный стек сохраняем
        1 +TO аргументов  \ а второй оставляем на следующую итерацию цикла
        продолжаем
      ELSE
        аргументов
          IF
            2L>
            -1 +TO аргументов
            1 +TO строк
            продолжаем
          ELSE
            1 +TO строк
            выход
          THEN
      THEN
  UNTIL
  собрать-строку
  результат 1+    \ И пропускаем первый пробел
;

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Последний раз редактировалось VoidVolker Вс фев 15, 2015 02:52, всего редактировалось 1 раз.

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

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

неа, решительно не понятно, почему нельзя без них обойтись :)

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


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
вопрос писал(а):
Но по крайней мере понятно, почему для моего алгоритма табуляторы так важны и что там делают?

неа, решительно не понятно, почему нельзя без них обойтись :)

чтобы сохранить возможность формировать операторы любого состава и вида, включающие в себя всё, что угодно кроме именно невидимых пробела и табулятора
например, оператор "сложить если правый меньше или уменьшить оба на 1 если левый меньше потом умножить" (шутка)
+if$right@<_OR_#1-if#left<х
идиотизм, но обьясняет замысел
в форте этой бессмыслице будет соответствовать последовательность операторов, которую нужно как-то задать именно как последовательность.

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
: 2>L >L >L ;
: 2L> L> L> ;
ага, пользуемся дополнительным стеком, а он там есть? :shock:

Код:
" sin cos tg ctg" VALUE функции
я так понял, что кварк строчку сохраняет и нет необходимости её отдельно копировать и сохранять?

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
вопрос писал(а):
ага, пользуемся дополнительным стеком, а он там есть?

Конечно - достаточно скачать новую версию ;)
вопрос писал(а):
я так понял, что кварк строчку сохраняет и нет необходимости её отдельно копировать и сохранять?

Ну так создаем строку и ее адресом инициализируем VALUE-перменную.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
я так понял, что кварк строчку сохраняет и нет необходимости её отдельно копировать и сохранять?

Да, все строки сохраняются.


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Да кстати, у меня не было возможности проверить на большом количестве различных формул и поэтому предлагаю попытаться найти "ломающую" формулу, но при этом корректную - механизм проверки корректности формулы отсутствует. И кроме отрицательных чисел - они не поддерживаются.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Хищник писал(а):
вопрос писал(а):
я так понял, что кварк строчку сохраняет и нет необходимости её отдельно копировать и сохранять?

Да, все строки сохраняются.

И ноль в конце ??
Я не просто спрашиваю - разные версии СПФ по-разному вели себя со строками и с нулями, мне пришлось сделать вот это
Код:
:  pfx.str_accept (  asc #  --  [new string] asc )
   HERE >R DUP ALLOT
   \ allot for string length
   0 TO priority_str_index
   BEGIN
   DUP  priority_str_index   ( presently : asc #  # index       ) 
   <             NOT 
   >R    
   OVER priority_str_index + C@ DUP         ( presently : asc # symbol symbol ) 
   0 <>
   R>              AND       \ symbol not is NULL and string not ended
   WHILE
   priority_str_index           ( presently : asc # symbol index  )
   R@
   + C!
   priority_str_index 1 + TO priority_str_index
   REPEAT
   \ the string was copied, this is needed: check the end of str - 32 0 to be
    DROP DROP DROP                       ( presently : [empty]  )
   
      \ first if the end of string is HERE - 1
      HERE 
      priority_str_index
      R@ + 
      <>
      IF 
        CR ." END OF COPIED STRING IS NOT THE END OF CURRENTLY ALLOCATED MEMORY ! "
        anykey? KEY DROP BYE   
      THEN
      priority_str_index R@ + C@ DUP    ( presently :  symbol symbol  )
      32 =
      IF 
      HERE
      1 ALLOT 0 SWAP C! DROP
      ELSE
         0 =
         IF  ( presently : [empty]  )
         priority_str_index R@ + 1 - C@   32 <>
               IF HERE 2 ALLOT  DUP 1 - 32 SWAP C! 0 SWAP C! ELSE 1 ALLOT THEN   
         ELSE
         HERE 1 ALLOT DUP  32 SWAP C! 1 + 0 SWAP C!             
         THEN 
      THEN
   R>                             \ return begin of str
   ;
    ( end: pfx.str_accept )

для копирования строки, причём всё, что после цикла - проверяет, помещает ли S" нуль как ограничитель и на каком расстоянии от начала :(

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
И ноль в конце ??

Да, конечно.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Итак, вот моё решение поставленной задачи - немного медлительное, зато выдаваемую строку можно прочитать и есть тригонометрические функции

странно что имел ввиду автор - во всех решениях строку можно прочитать и в любом тем или иным способом можно добавить многолитерные операторы - внимательнее VoidVolker :D :wink:

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
вопрос писал(а):
тем или иным способом можно добавить многолитерные операторы

А у меня-то они уже есть 8)
вопрос писал(а):
И ноль в конце ??

И не только ноль в конце, а еще и перед первым сиволом 4-байтный счетчик записывается.
вопрос писал(а):
Я не просто спрашиваю - разные версии СПФ по-разному вели себя со строками и с нулями, мне пришлось сделать вот это

И что оно делает? Зачем такие сложности? Мне кажется проще самому написать или просто поискать в DEVEL подходящую библиотеку для работы со строками.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
VoidVolker писал(а):
вопрос писал(а):
тем или иным способом можно добавить многолитерные операторы

А у меня-то они уже есть 8)

Смеяться или плакать? :)) И у меня есть, причём с самого начала так задумано, притом заменяемые (и вариативно) ... и даже многословные а не только многознаковые!

:dmad; Я делаю грустный вывод, что фортеры совсем не имеют привычки читать чужой код или разбирать чужие решения: так дальше "своего форта" уйти не получится (можно будет долго мечтать об оси)

Чуть подробнее.

Алгоритм в моём решении построен следующим образом
- есть строка , в которой присутствуют операторы
вот такая
S" * / % + - >> << < <= > >= == != & ^ | && || = *= /= %= += -= <<= >>= &= ^= |= "
В ней, как можно заметить, присутсвуют и однознаковые и многознаковые операторы (однознаковых даже меньше) - выделил несколько для примера
- ей сопоставлена строка аналогов (может быть не одна строка аналогов )
вот такая
S" * / MOD + - RSHIFT LSHIFT < > NOT > < NOT = <> AND XOR OR AND OR SWAP ! OVER @ * SWAP ! OVER @ SWAP / SWAP ! OVER @ SWAP MOD SWAP ! OVER @ + SWAP ! OVER @ SWAP - SWAP ! OVER @ SWAP LSHIFT SWAP ! OVER @ SWAP RSHIFT SWAP ! OVER @ AND SWAP ! OVER @ XOR SWAP ! OVER @ OR SWAP ! "
в строке аналогов присутствуют ... аналоги :) для операторов из первой строки. Причём, аналог не повторяет оператор из первой строки, а заменяет его, что делает возможным перевод с языка на язык.
Эти аналоги могут состоять не только из множества букв, но и из нескольких операторов, например, оператору << соответствует оператор LSHIFT ( С++ -- форт соответственно ), а оператору <<= из строки образцов соответствует группа OVER @ SWAP LSHIFT SWAP !
Можно задать много "первых" строк и поставить им в соответствие много "вторых" строк. предусмотрено место для встраивания в алгоритм проверки синтаксиса в строке ... Самый примитивный - присутствует - выше примеры.

VoidVolker писал(а):
И не только ноль в конце, а еще и перед первым сиволом 4-байтный счетчик записывается.
вопрос писал(а):
Я не просто спрашиваю - разные версии СПФ по-разному вели себя со строками и с нулями, мне пришлось сделать вот это

И что оно делает?

Копирует строку, в постоянную память, проверяя по ходу
1. не изменил ли какой-либо встроенный в форт алгоритм HERE незаметно.
2. появился ли 0 в конце строки.
3. остался ли пробел перед 0.
4. На каком расстоянии от конца строки 0 и заметно ли это из счётчика (можно ведь "считать" только значимые символы, выделяя байт под 0 втихаря)

VoidVolker писал(а):
Зачем такие сложности? Мне кажется проще самому написать или просто поискать в DEVEL подходящую библиотеку для работы со строками.

Я и нашёл подходящую, т.е. она встроена в SPF4WC - винконсоль (удобная штука), но при попытке запуститься без консоли строки стали вести себя совсем иначе. Так что библиотека, подходлящая для одного слукчая оказалась совсем неподходящей для другого. :x

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
вопрос писал(а):
Я делаю грустный вывод, что фортеры совсем не имеют привычки читать чужой код или разбирать чужие решения

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

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Код - да, трудночитаемый, нужно бы документировать, но это ведь конкурс а не проект.

Алгоритм Дейкстры - самый простой алгоритм преобразования инфикса и т.п. в постфикс
Собственно, он настолько прост, что имя там даже лишнее ...
Это первое, что приходит в голову - доп. стек с приоритетами. Затем туда выталкиваются операторы или вталкиваются оттуда .
http://algolist.manual.ru/syntax/revpn.php


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

(Злорадно) А вот почему я С++ читаю без напряга (почти)...

Все одинаково неправы, делая код нечитаемым :(

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8 ... 10  След.

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


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

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


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

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