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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу Пред.  1 ... 20, 21, 22, 23, 24, 25, 26, 27  След.
Автор Сообщение
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 21, 2012 16:14 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Alex писал(а):
уважаемый chess растолкуйте мне один моментик

Это да. Только это я сделал ради опробования. Практика показала, что вариант не лучше изначального.
Поэтому ничего не изменяйте, я у себя поменяю.
Alex писал(а):
и еще прошу Вас зарезервировать за мной набор 'd* команд.

Хорошо. Если не секрет, что за команды будут?

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 22, 2012 10:21 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
пока задействовал 'dp,'dX,'d+,'d-,'d@,'d!,'d=,'d>,'d<,'di.'ds,'dv
'dn,'dz,'dw,'dl,'dr,'do,'da,'d0,'d1,'d2,'d3,'d4,'d5,'d6,'d7,'d8,'d9
это data base wordset, набор команд встроенной базы данных. Очень
примитивная, проще чем FBASE ОТ инфо-форт и pfDatabase от Elizabeth Rather
and Dennis Ruffer. пока так: один файл базы данных есть одна таблица,
количество записей фиксировано, полей не более 10. имен полей нет, они
нумеруются - поле 0... поле 9. файл мапится целиком в память, данные
хранятся поколоночно (по столбцам). предполагаю, что с помощью
манипуляторов можно будет делать компактные и гибкие запросы.
занимаюсь от случая к случаю, если кому интересно, дайте знать,
дабы повысить мотивацию.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Чт дек 27, 2012 12:40 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
последний рабочий вариант
Код:
S" case.f" INCLUDED

USER-CREATE /d0/ 10 10 * CELLS USER-ALLOT USER /d/ /d0/ /d/ !

USER /org USER /beg USER /cur USER /lim USER /a/ USER /u/    VECT sm,

: SPDROP ( n -- )   [ BASE @ HEX C1 C, E0 C, 02 C, 03 C, E8 C, 8B C, 45 C, 00 C, 8D C, 6D C, 04 C, C3 C, BASE ! ] ;
: SPMOVE ( a n -- ) [ BASE @ HEX 8D C, 5D C, 04 C, 8B C, 55 C, 00 C, 8B C, 0B C, 89 C, 0A C, 8D C, 52 C, 04 C,
                           8D C, 5B C, 04 C, 48 C, 75 C, F3 C, 8B C, 45 C, 04 C, 8D C, 6D C, 08 C, C3 C, BASE ! ] ;

\ Слово __  надо использовать для реентерабельных целей просто переустанавливает
\ указатель /d/ и готовит возврат к предыдущему буферу(кадру) при выходе из слова
\ с манипулятором (такой простейший стек).

: __RET -10 CELLS /d/ +! ;      : __   10 CELLS /d/ +! R> ['] __RET >R >R ;

: sm+  10 CELLS /d/ +! ;   IMMEDIATE
   
: sm- -10 CELLS /d/ +! ;   IMMEDIATE   

\ непосредственно установка рабочего буфера(кадра) ( 0 d!, 1 d! ...9 d! ):
: d! ( n -- ) 10 * CELLS /d0/ + /d/ ! ; 

: "0 0 d! ;   : "1 1 d! ;   : "2 2 d! ;   : "3 3 d! ;   : "4 4 d! ;
: "5 5 d! ;   : "6 6 d! ;   : "7 7 d! ;   : "8 8 d! ;   : "9 9 d! ;

\ доступ к адресам ячеек
: '0 /d/ @ 36 + ; : '1 /d/ @ 32 + ; : '2 /d/ @ 28 + ; : '3 /d/ @ 24 + ;
: '4 /d/ @ 20 + ; : '5 /d/ @ 16 + ; : '6 /d/ @ 12 + ; : '7 /d/ @  8 + ;
: '8 /d/ @  4 + ; : '9 /d/ @      ; 

\ копирование значений со стека данных в последовательные ячейки манипулятора
: 0| ;              : 0\ ; : 1| /d/ @ 32 + 1 SPMOVE ; : 2| /d/ @ 28 + 2 SPMOVE ;
: 3| /d/ @ 24 + 3 SPMOVE ; : 4| /d/ @ 20 + 4 SPMOVE ; : 5| /d/ @ 16 + 5 SPMOVE ;
: 6| /d/ @ 12 + 6 SPMOVE ; : 7| /d/ @  8 + 7 SPMOVE ; : 8| /d/ @  4 + 8 SPMOVE ;
: 9| /d/ @      9 SPMOVE ;

\ загрузка значений со стека данных в последовательные ячейки манипулятора
: 1\ /d/ @ 32 + 1 SPMOVE 1 SPDROP ; : 2\ /d/ @ 28 + 2 SPMOVE 2 SPDROP ; : 3\ /d/ @ 24 + 3 SPMOVE 3 SPDROP ;
: 4\ /d/ @ 20 + 4 SPMOVE 4 SPDROP ; : 5\ /d/ @ 16 + 5 SPMOVE 5 SPDROP ; : 6\ /d/ @ 12 + 6 SPMOVE 6 SPDROP ;
: 7\ /d/ @  8 + 7 SPMOVE 7 SPDROP ; : 8\ /d/ @  4 + 8 SPMOVE 8 SPDROP ; : 9\ /d/ @      9 SPMOVE 9 SPDROP ;

\ вспомагательные слова
: dg? ( a -- f ) C@ [CHAR] 0 [CHAR] 9 1+ WITHIN  ;
: [c,] ( C -- ) 48 - 9 SWAP - CELLS LIT, ;
: [d,]  ['] /d/ COMPILE, ['] @ COMPILE, ['] + COMPILE, ;
: [p,]  2- LIT, ['] PICK COMPILE, ;
: num? ( a u -- f ) OVER DUP dg? SWAP C@ [CHAR] - = OR -ROT OVER SWAP 1 D+ ?DO I dg? AND LOOP ;

\ ======
\ распознать что мы имеем на входе m-block ( манипулятор-блок или макро-блок ) и
\ скомпилировать предписанные его символам действия. m-block цепочка символов более
\ одного и заканчивающееся символом '_'
\ пример  : t1 1 1\ 1._ ;  печать 1

: NOTFOUND  ( A U -- ) \ m-block   
  2DUP /u/ ! /a/ ! + 1- C@ [CHAR] _ = /u/ @ 1 > AND 0= IF /a/ @ /u/ @ NOTFOUND EXIT THEN
  /a/ @ DUP /cur ! /u/ @ + 2- /lim ! BEGIN sm, /cur @ /lim @ <> WHILE /cur 1+! REPEAT ;


\ ======
\ произвольная загрузка ячеек манипулятора 1 2 3 456i - загрузить число 1 в ячейку 4,
\ число 2 в ячейку 5, число 3 в ячейку 6
\  пример  : t2 1 2 3 456i 4.5.6._ ;  печать 1 2 3

: NOTFOUND ( A U -- ) \ i-block
  /u/ ! /a/ ! /a/ @ /u/ @ + 1- DUP C@ [CHAR] i = SWAP /a/ @ ?DO I dg? AND LOOP 0= IF /a/ @ /u/ @ NOTFOUND EXIT THEN
  /a/ @ DUP /u/ @ + 2- DO I C@ [c,] [d,] ['] ! COMPILE, -1 +LOOP ;

\ ======
\ произвольная копирование в ячейки манипулятора 1 2 3 456p - скопировать число 1 в ячейку 4,
\ число 2 в ячейку 5, число 3 в ячейку 6, на стеке данные не изменны
\ пример  : t3 1 2 3 456p 4.5.6._ ;  печать 1 2 3 на стеке 1 2 3

: NOTFOUND ( A U -- ) \ p-block
  /u/ ! /a/ ! /a/ @ /u/ @ + 1- DUP C@ [CHAR] p = SWAP /a/ @ ?DO I dg? AND LOOP 0= IF /a/ @ /u/ @ NOTFOUND EXIT THEN
  2 /a/ @ DUP /u/ @ + 2- DO DUP [p,] I C@ [c,] [d,] ['] ! COMPILE, 1+ -1 +LOOP DROP ;

\ ======
\ признак: если длина строки нечетная И в середине символ '@' И остальные символы - цифры
\ 1@2 --- извлечь данные из адреса записанного в ячейке 1 и изменить адрес
\ на величину в ячейке 2 ( групповые варианты 123@789 123@555 )
\ пример  : t4 4 5 '9 091i ." befo '1=" 1._ 1@0 ." afte '1=" 1._ ; адрес в ячейке 0 увеличен на стеке значение 5

: NOTFOUND ( A U -- ) \ @-block 
/u/ ! /a/ ! /u/ @ 2 MOD 1 = /a/ @ /u/ @ 2/ + C@ [CHAR] @ = AND /u/ @ 2/ /a/ @ + /a/ @ ?DO I dg? AND LOOP
/a/ @ /u/ @ + /a/ @ /u/ @ 2/ + 1+ ?DO I dg? AND LOOP 0= IF /a/ @ /u/ @ NOTFOUND EXIT THEN
/u/ @ 2/ 1+ /org ! /u/ @ 2/ /a/ @ + /a/ @
?DO I C@ [c,] [d,] ['] @ COMPILE, ['] @ COMPILE, I /org @ + C@ [c,] [d,] ['] @ COMPILE, I C@ [c,] [d,] ['] +! COMPILE, LOOP ;


\ ======
\ признак: если длина строки нечетная И в середине символ '!' И остальные символы - цифры
\ 5 1!2 --- записать число 5 по адресу записанному в ячейке 1 и изменить адрес
\ на величину в ячейке 2 ( групповые варианты 1 2 3 123!789 1 2 3 123!555 )
\ пример  : t5 5 4 '2 ! '9 '1 ! '1 @ ." befo'1=" . 1!2 '1 @ ." after'1=" . '9 @ ;       


: NOTFOUND ( A U -- ) \ !-block   
/u/ ! /a/ ! /u/ @ 2 MOD 1 = /a/ @ /u/ @ 2/ + C@ [CHAR] ! = AND /u/ @ 2/ /a/ @ + /a/ @
?DO I dg? AND LOOP /a/ @ /u/ @ + /a/ @ /u/ @ 2/ + 1+ ?DO I dg? AND LOOP 0= IF /a/ @ /u/ @ NOTFOUND EXIT THEN 
/u/ @ 2/ 1+ /org ! /u/ @ 2/ /a/ @ + /a/ @ ?DO I C@ [c,] [d,] ['] @ COMPILE, ['] ! COMPILE, I /org @ + C@ [c,] [d,] ['] @ COMPILE, I C@ [c,] [d,] ['] +! COMPILE, LOOP ;


\ ' перед 0...9 - адрес ячеек 0...9, перед a...z, A...Z, ~...? - признак двухсимвольных операторов

: 'parse 
   /cur 1+!
   /cur @    dg? IF /cur @ C@ [c,] [d,] EXIT THEN
   /cur @ 2 num? IF /cur @ 2 ?SLITERAL1 /cur 1+! EXIT  THEN
   /cur @ 2 SFIND 0= IF NOTFOUND ELSE COMPILE, /cur 1+! THEN ;

\ " перед 0...9 - номер буфера стека, перед a...z, A...Z, ~...? - признак трехсимвольных операторов

: "parse 
   /cur 1+!
   /cur @ 3 num? IF /cur @ 3 ?SLITERAL1 /cur 2 /cur +! DROP EXIT THEN
   /cur @ 3 SFIND 0= IF NOTFOUND ELSE COMPILE, 2 /cur +! THEN  ;


: sm.tst? ( a u -- f ) /u/ ! DUP /a/ ! dg? /a/ @ 1+ DUP DUP C@ [CHAR] \ = SWAP C@ [CHAR] | = OR SWAP C@ [CHAR] / = OR AND /u/ @ 2 > AND ;

: sm.load ( a u -- beg end )  /a/ @ C@ 48 - /org !
/a/ @ 1+ C@ [CHAR] / = IF /org @ LIT, ['] d! COMPILE, ELSE
/org @ 0<> IF /a/ @ C@ [c,] [d,] /org @ LIT, ['] SPMOVE COMPILE,
/a/ @ 1+ C@ [CHAR] \ = IF /org @ LIT, ['] SPDROP COMPILE, THEN THEN THEN
/a/ @ 2+ /beg ! /a/ @ /u/ @ + /lim ! ;

: sm.comp /beg @ /cur ! BEGIN sm, /lim @ /cur @ <> WHILE /cur 1+! REPEAT ;

: sm,,,]  /cur @ 1+ /beg ! BEGIN /cur @ 1+ C@ [CHAR] ] <> WHILE /cur 1+! REPEAT
          /cur 1+! /beg @ /cur @ OVER - sm.tst? IF sm.load sm.comp ELSE /a/ @ /u/ @ SFIND 0= IF NOTFOUND ELSE COMPILE, THEN THEN ;


\ Lambda. код внутри конструкции LAMBDA{  }LAMBDA не выполняется, возвращается xt на этот код.   
: LAMBDA{  ( -- ) LAST-NON HERE BRANCH, >MARK 2 HERE DUP TO LAST-NON ; IMMEDIATE
: }LAMBDA  ( -- xt )  >R POSTPONE EXIT POSTPONE THEN R> POSTPONE LITERAL TO LAST-NON ; IMMEDIATE

: S' [CHAR] ' PARSE [COMPILE] SLITERAL ; IMMEDIATE

: ??  ( a u --  f ) SWAP OVER /cur @ OVER COMPARE 0= IF 1- /cur +! 0 THEN ;

: op, ( -- )   

0 CASE

  S" {"   ?? OF POSTPONE LAMBDA{  ENDOF
  S" }"   ?? OF POSTPONE }LAMBDA  ENDOF

                                         
  S" `+"   ?? OF ['] D+         COMPILE, ENDOF
  S" `-"   ?? OF ['] D-         COMPILE, ENDOF
  S" `@"   ?? OF ['] 2@         COMPILE, ENDOF
  S" `!"   ?? OF ['] 2!         COMPILE, ENDOF
  S" `n"   ?? OF ['] DNEGATE    COMPILE, ENDOF
  S" `a"   ?? OF ['] DABS       COMPILE, ENDOF
\  S" `|"   ?? OF ['] DOR        COMPILE, ENDOF
\  S" `^"   ?? OF ['] DXOR       COMPILE, ENDOF
\  S" `&"   ?? OF ['] DAND       COMPILE, ENDOF
\  S" `~"   ?? OF ['] DINVERT    COMPILE, ENDOF
\  S" `l"   ?? OF ['] DLSHIFT    COMPILE, ENDOF
\  S" `r"   ?? OF ['] DRSHIFT    COMPILE, ENDOF
\  S" `>"   ?? OF ['] D>         COMPILE, ENDOF
\  S" `<"   ?? OF ['] D<         COMPILE, ENDOF
  S" `="   ?? OF ['] D=         COMPILE, ENDOF
\  S" `Z"   ?? OF ['] D0=        COMPILE, ENDOF
\  S" `z"   ?? OF ['] D0= INVERT COMPILE, ENDOF
  S" `d"   ?? OF ['] 2DUP       COMPILE, ENDOF
  S" `x"   ?? OF ['] 2DROP      COMPILE, ENDOF
  S" `."   ?? OF ['] D.         COMPILE, ENDOF
  S" `S"   ?? OF ['] D>S        COMPILE, ENDOF
  S" `D"   ?? OF ['] S>D        COMPILE, ENDOF

  S" 0" ??  OF 36 LIT, [d,] ['] @ COMPILE, ENDOF   
  S" 1" ??  OF 32 LIT, [d,] ['] @ COMPILE, ENDOF   
  S" 2" ??  OF 28 LIT, [d,] ['] @ COMPILE, ENDOF   
  S" 3" ??  OF 24 LIT, [d,] ['] @ COMPILE, ENDOF   
  S" 4" ??  OF 20 LIT, [d,] ['] @ COMPILE, ENDOF   
  S" 5" ??  OF 16 LIT, [d,] ['] @ COMPILE, ENDOF
  S" 6" ??  OF 12 LIT, [d,] ['] @ COMPILE, ENDOF
  S" 7" ??  OF  8 LIT, [d,] ['] @ COMPILE, ENDOF
  S" 8" ??  OF  4 LIT, [d,] ['] @ COMPILE, ENDOF
  S" 9" ??  OF  0 LIT, [d,] ['] @ COMPILE, ENDOF

  S" +" ??  OF ['] +        COMPILE, ENDOF \ арифметика
  S" -" ??  OF ['] -        COMPILE, ENDOF
  S" *" ??  OF ['] *        COMPILE, ENDOF
  S" /" ??  OF ['] /        COMPILE, ENDOF
  S" %" ??  OF ['] MOD      COMPILE, ENDOF
  S" :" ??  OF ['] /MOD     COMPILE, ENDOF
  S" n" ??  OF ['] NEGATE   COMPILE, ENDOF
  S" a" ??  OF ['] ABS      COMPILE, ENDOF

  S" |" ??  OF ['] OR       COMPILE, ENDOF \ логика и сдвиги
  S" ^" ??  OF ['] XOR      COMPILE, ENDOF
  S" &" ??  OF ['] AND      COMPILE, ENDOF
  S" ~" ??  OF ['] INVERT   COMPILE, ENDOF
  S" r" ??  OF ['] RSHIFT   COMPILE, ENDOF
  S" l" ??  OF ['] LSHIFT   COMPILE, ENDOF

  S" !" ??  OF ['] !        COMPILE, ENDOF \ память
  S" @" ??  OF ['] @        COMPILE, ENDOF
  S" b" ??  OF ['] C@       COMPILE, ENDOF
  S" w" ??  OF ['] C!       COMPILE, ENDOF
  S" V" ??  OF ['] MOVE     COMPILE, ENDOF
  S" F" ??  OF ['] FILL     COMPILE, ENDOF

  S" a" ??  OF ['] ABS      COMPILE, ENDOF
  S" f" ??  OF ['] NextWord COMPILE, ENDOF
  S" o" ??  OF ['] THROW    COMPILE, ENDOF
  S" h" ??  OF ['] HERE     COMPILE, ENDOF
  S" =" ??  OF ['] =        COMPILE, ENDOF \ сравнения
  S" >" ??  OF ['] >        COMPILE, ENDOF
  S" <" ??  OF ['] <        COMPILE, ENDOF
  S" z" ??  OF ['] 0<>      COMPILE, ENDOF
  S" Z" ??  OF ['] 0=       COMPILE, ENDOF
  S" m" ??  OF ['] MIN      COMPILE, ENDOF
  S" M" ??  OF ['] MAX      COMPILE, ENDOF
  S" H" ??  OF ['] WITHIN   COMPILE, ENDOF

  S" d" ??  OF ['] DUP      COMPILE, ENDOF \ копирование и удаление в стеке
  S" x" ??  OF ['] DROP     COMPILE, ENDOF
  S" P" ??  OF ['] DEPTH    COMPILE, ENDOF

  S" Y" ??  OF ['] TRUE     COMPILE, ENDOF
  S" y" ??  OF ['] FALSE    COMPILE, ENDOF

  S" i" ??  OF POSTPONE IF        ENDOF \ ветвления
  S" e" ??  OF POSTPONE ELSE      ENDOF
  S" t" ??  OF POSTPONE THEN      ENDOF
  S" D" ??  OF POSTPONE DO        ENDOF \ циклы со счетчиком
  S" G" ??  OF POSTPONE ?DO       ENDOF
  S" L" ??  OF POSTPONE LOOP      ENDOF
  S" N" ??  OF POSTPONE +LOOP     ENDOF
  S" I" ??  OF POSTPONE I         ENDOF
  S" J" ??  OF POSTPONE J         ENDOF
  S" Q" ??  OF POSTPONE LEAVE     ENDOF
  S" B" ??  OF POSTPONE BEGIN     ENDOF \ циклы
  S" A" ??  OF POSTPONE ACCEPT    ENDOF
  S" U" ??  OF POSTPONE UNTIL     ENDOF
  S" W" ??  OF POSTPONE WHILE     ENDOF
  S" R" ??  OF POSTPONE REPEAT    ENDOF
  S" ;" ??  OF POSTPONE EXIT      ENDOF
  S" C" ??  OF POSTPONE CASE      ENDOF \ выбор по целому
  S" E" ??  OF POSTPONE ENDCASE   ENDOF
  S" (" ??  OF POSTPONE OF        ENDOF
  S" )" ??  OF POSTPONE ENDOF     ENDOF

  S" ." ??  OF ['] .        COMPILE, ENDOF \ печать
  S" c" ??  OF ['] EMIT     COMPILE, ENDOF
  S" S" ??  OF ['] SPACES   COMPILE, ENDOF
  S" T" ??  OF ['] TYPE     COMPILE, ENDOF
  S" \" ??  OF ['] CR       COMPILE, ENDOF
  S" X" ??  OF ['] EXECUTE  COMPILE, ENDOF
\  S" p" ??  OF ['] CHOOSE   COMPILE, ENDOF
  S" q" ??  OF ['] COMPARE  COMPILE, ENDOF
  S" s" ??  OF ['] SEARCH   COMPILE, ENDOF
  S" n" ??  OF ['] NEGATE   COMPILE, ENDOF
  S" $" ??  OF ['] SFIND    COMPILE, ENDOF
  S" O" ??  OF ['] AGAIN    COMPILE, ENDOF
  S" v" ??  OF ['] EVALUATE COMPILE, ENDOF
  S" K" ??  OF ['] EKEY     COMPILE, ENDOF
  S" k" ??  OF ['] KEY      COMPILE, ENDOF
  S" ," ??  OF ['] COMPILE, COMPILE, ENDOF
  S" #" ??  OF ['] >NUMBER  COMPILE, ENDOF

\  S" g" ??  OF ['] BRANCH,  COMPILE, ENDOF
\  S" j" ??  OF ['] ?BRANCH, COMPILE, ENDOF

  S" `" ??  OF /cur 1+! /cur @ C@ 48 - LIT,  ENDOF

  S" [" ??  OF sm,,,]  ENDOF   
  S" '" ??  OF 'parse  ENDOF
  S' "' ??  OF "parse  ENDOF
         
ENDCASE  ;

' op, TO sm,

: NOTFOUND ( A U -- ) sm.tst? IF sm.load sm.comp ELSE /a/ @ /u/ @ NOTFOUND THEN ;

\EOF


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Чт дек 27, 2012 12:43 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
true-grue писал(а):
Вводится специальная конструкция, в виде аналога стековой картинки, где в именованном виде фигурируют несколько элементов от вершины стека данных.

Пример.
Код:
: swap { first second - second first } ;

Будем считать, что { ... } генерирует необходимый код для преобразования стека данных (например, с помощью pick, roll и т.п.). Разумеется, что first, second это никакие не слова, а лишь фрагменты текста, которые подлежат сравнению.
Хочу обратить особое внимание на крайне полезный побочный эффект введения подобной конструкции: код становится самодокументированным.


Вот набросал небольшой компилятор такой конструкции в стековый манипулятор
принцип работы: при нахождении во входном потоке { идет накопление
и подсчет слов в буфере до символа - далее по второй части от - до } идет
формирование стекового манипулятора. стековый манипулятор записывается
прям поверх во входном потоке и компилируется.

ограничения: не более 9 слов в части { ... - длиной не более 15 символов каждый
в части - ... } не более 13 слов. Вся конструкция должна быть в одной
строке ( в одном чанке REFILL )

Код:
S" sm.f" INCLUDED

CREATE buf 160 ALLOT  buf 160 BL FILL

VARIABLE wrd
VARIABLE sym
VARIABLE tmp

: cur ( -- a ) buf wrd @ 16 * + ;
: sym+ ( char -- ) sym @ 1+ 13 MIN DUP sym ! buf 2+ + C! sym @ 2+ buf C! ;
: wrd+ wrd @ 1+ 9 MIN wrd ! ;
: wrd! ( a u -- )  15 MIN DUP cur C! cur 1+ SWAP CMOVE ;
: wrd@ ( i -- a u ) 16 * buf + DUP C@ 1 0 D+ ;
: find ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I wrd@ COMPARE 0= IF I 48 + sym+ LEAVE THEN LOOP 2DROP ;

: {

  >IN @ tmp ! 0 wrd ! 0 sym !

  BEGIN
    NextWord 2DUP S" -" COMPARE   
  WHILE
    wrd+ wrd!
  REPEAT 2DROP

  wrd @ 48 + buf 1+ C! [CHAR] \ buf 2+ C!

  BEGIN
    NextWord 2DUP  S" }" COMPARE   
  WHILE
    find 
  REPEAT 2DROP

SOURCE DROP tmp @ + >IN @  tmp @ - BL FILL 

buf 1+ SOURCE DROP tmp @ + buf C@ CMOVE tmp @ >IN !

; IMMEDIATE

: test1 1 2 3  { one two - two one } ." inp: 1 2 3 out: 1 3 2 "  ; ( здесь компилируется манипулятор 2\21 )

: test2 1 2 3  { fan tas tic  - fan tic } ." inp: 1 2 3 out: 1 3 "  ; ( здесь компилируется манипулятор 3\13 )

\EOF

содержимое sm.f в предыдущем сообщении, Удачи.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Чт дек 27, 2012 14:38 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
Alex писал(а):
true-grue писал(а):
Вводится специальная конструкция, в виде аналога стековой картинки, где в именованном виде фигурируют несколько элементов от вершины стека данных.

Пример.
Код:
: swap { first second - second first } ;

Будем считать, что { ... } генерирует необходимый код для преобразования стека данных (например, с помощью pick, roll и т.п.). Разумеется, что first, second это никакие не слова, а лишь фрагменты текста, которые подлежат сравнению.
Хочу обратить особое внимание на крайне полезный побочный эффект введения подобной конструкции: код становится самодокументированным.


Вот набросал небольшой компилятор такой конструкции в стековый манипулятор


Хорошая работа, спасибо! Проверил, работает. Хотелось, чтобы компилятор принимал и строки вида "{ a b-b a}", то есть без дополнительных пробелов. Контроль ошибок/опечаток тоже необходим. Но и в таком виде уже можно успешно экспериментировать и набирать опыт практического использования.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 00:35 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
true-grue писал(а):
Но и в таком виде уже можно успешно экспериментировать и набирать опыт практического использования.

Сама задача не такая тривиально-комбинаторная :) , поэтому с задачей "ручного жонглирования стеком" "придётся" мириться и включать
пространственное воображение.

P.S. Попробовал поискать некоторую информации по оптимальным стековым перестановкам (где то были вроде даже в i-nete online скрипты
и кое-какие обсуждения на местном форуме)
"Попалась" инфа Optimal_stack_reording_in_Forth
результат c использованием слов {"nop", "drop", "swap", "rot", "-rot", ">r", "r>", "dup", "over"}
Как отнесётся, например, к данному варианту встроенный оптимизатор в Форт системе (например в SPF4) тоже интересно рассмотреть.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 09:31 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
немного упростил код. можно переименовать слово { например в {{ и
внутри поменять строку S" }" на S" }}" если надо пользоваться локальными переменными.
Код:
S" sm.f" INCLUDED
CREATE buf 160 ALLOT  buf 160 BL FILL
VARIABLE wrd   VARIABLE sym  VARIABLE tmp

: sym+ ( char -- ) buf C@ 1+ DUP buf C! buf + C! ;
: wrd! ( a u -- ) wrd @ 1+ wrd ! buf wrd @ 16 * + 2DUP C! 1+ SWAP CMOVE ;
: fnd! ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I 16 * buf + DUP C@ 1 0 D+ COMPARE 0= IF I 48 + sym+ LEAVE THEN LOOP 2DROP ;

: {      ( === преобразавать текст внутри  { ..... } в стековый манипулятор === )       

  >IN @ tmp ! 0 wrd ! 2 buf C!

  BEGIN NextWord 2DUP S" -" COMPARE WHILE wrd! REPEAT 2DROP

  wrd @ 48 + buf 1+ C! [CHAR] \ buf 2+ C!

  BEGIN NextWord 2DUP S" }" COMPARE WHILE fnd! REPEAT 2DROP

  SOURCE DROP tmp @ + >IN @  tmp @ - BL FILL 

  buf 1+ SOURCE DROP tmp @ + buf C@ CMOVE tmp @ >IN !

; IMMEDIATE

true-grue писал(а):
Хотелось, чтобы компилятор принимал и строки вида "{ a b-b a}", то есть без дополнительных пробелов.

тут надо подумать. с одной стороны мы уменьшаем нашу запись на три символа
и немного усложняем реализацию, но мы также лишаемся возможности внутри наших
человеческих слов использования знаков - и } ( например "6-параметр" "идти-влево" "{intro}" )
ну и мы все равно используем стековые манипуляторы, тогда можно написать
прям на них, и сопроводить многостроковым комментарием.

кстати а Вы видели audiovisual programs IBNIZ? очень похоже на
стековые манипуляторы, и даже набор команд частично совпадает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 13:11 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
Kopa писал(а):
Сама задача не такая тривиально-комбинаторная :) , поэтому с задачей "ручного жонглирования стеком" "придётся" мириться и включать
пространственное воображение.

Комбинаторная задача, которая относится к NP-классу, тривиальной уже не называется. О сложности решения задачи о стековых перестановках с помощью классических фортовских стековых операций я представление имею: http://sovietov.com/app/forthwiz.html

Задача становится тривиальной, если у нас есть pick/roll или иные средства для обращения со стеком, как с массивом.

Alex писал(а):
кстати а Вы видели audiovisual programs IBNIZ? очень похоже на
стековые манипуляторы, и даже набор команд частично совпадает.


Да, я видел IBNIZ. Это специализированный язык, связанный с эстетикой демосцены и очень важным понятием Колмогоровской сложности (http://ru.wikipedia.org/wiki/%D0%9A%D0% ... 1%82%D1%8C ). Желательно не путать цели и задачи IBNIZ и обычного ЯП, такого как Форт :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 15:26 
true-grue писал(а):
Задача становится тривиальной, если у нас есть pick/roll или иные средства для обращения со стеком, как с массивом.

Не становится. pick/roll считают от вершины стека, а он постоянно меняется в процессе выполнения слов. Мало того, результат может оставаться на том-же стеке...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 16:00 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
"Не становится"! Так что, остается только посыпать голову пеплом, вываляться в смоле и перьях? :)
Напомню задачу. Есть стековая картинка, нужно автоматически сгенерировать соответствующий ей, оптимальный по длине, код. При этом.

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

2. Если есть средства для обращения со стеком, как с массивом, то задача оказывается вполне эффективно решаемой. Те же "манипуляторы" это наглядно(?) иллюстрируют.

Вы, ArtemKAD, нас на "темную сторону" (locals) не переведете, даже не надейтесь! :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 16:46 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
true-grue писал(а):
"Не становится"! Так что, остается только посыпать голову пеплом, вываляться в смоле и перьях? :)

Ещё ссылки:
ранее была в обсуждении вариантов Forth Wizard Forth Stack optimization
и Бэкфорт в примерах, местами даже полезных.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 17:27 
true-grue писал(а):
"Не становится"! Так что, остается только посыпать голову пеплом, вываляться в смоле и перьях? :)
Напомню задачу. Есть стековая картинка, нужно автоматически сгенерировать соответствующий ей, оптимальный по длине, код.

После КАЖДОГО слова стековая картинка меняется. Предлагаете каждый раз оптимально манипулировать стеком ? Или все-же задаться вопросом откуда вообще такая сложность? Почему служебная функция размещения на стеке параметров в нужном порядке становится самоцелью?
Да и потом, программа в первую очередь должна быть понятна. Почему у вас критерий оптимальности "оптимальный по длине", а не "оптимальный по понятности текста программы"?
true-grue писал(а):
2. Если есть средства для обращения со стеком, как с массивом, то задача оказывается вполне эффективно решаемой. Те же "манипуляторы" это наглядно(?) иллюстрируют.

О да... Они хорошо иллюстрируют что за каша получается. Вы еще не забыли, что Форт создавался для упрощения интерфейса между человеком и машиной? Там зачем снова превращать написание программы в набор текста по таблице машинных(манипуляторных) кодов? Скажите, откуда такое желание сделать как можно сложней и непонятней?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 18:01 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
Что же Вы за путанник такой, ArtemKAD! И совсем не следите за дискуссией. Или специально издеваетесь.
Критерий оптимальности касается _сгенерированного кода_. Пользователь его не увидит. Если Вы попробуете вникнуть в ситуацию, то заметите, что я все это время говорил о варианте манипуляторов "с человеческим лицом". В дискуссии с dynamic-wind я показал на примерах (count> и appIf) преимущества предложенной конструкции. Что может быть проще и понятнее декларативного комментария, который, в то же самое время, генерирует весь необходимый код?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 21:18 
true-grue писал(а):
Что же Вы за путанник такой, ArtemKAD! И совсем не следите за дискуссией. Или специально издеваетесь.
Критерий оптимальности касается _сгенерированного кода_. Пользователь его не увидит.

Если критерий касается исключительно сгенерированного кода, то дискуссия вообще не о том. Тогда надо обсуждать уже оптимизацию готового кода - как вариант оптимизатор-подстановщик Максимова.
true-grue писал(а):
Если Вы попробуете вникнуть в ситуацию, то заметите, что я все это время говорил о варианте манипуляторов "с человеческим лицом".

Пока что манипуляторы с самым человеческим лицом - локалсы.
true-grue писал(а):
В дискуссии с dynamic-wind я показал на примерах (count> и appIf) преимущества предложенной конструкции. Что может быть проще и понятнее декларативного комментария, который, в то же самое время, генерирует весь необходимый код?


Это этот что-ли?
Код:
: count> ( x array - x count)
   0 swap each: { x count element - x count element x} > if 1 + then ;

Как по мне конкретно этот пример не слишком понятнее чем
Код:
: count> ( x array --) 0 SWAP each: 2 PICK > IF 1 + THEN ;

Кроме того, когда "декларативный комментарий" начинают запихивать в жесткие рамки правил он перестает быть комментанием. Суть перестановки в конкретно том месте была - сравнить с 3 элементом на стеке, но формальное правило заставило описывать, что с первым и вторым элементом ничего не произошло...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 21:40 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
ArtemKAD писал(а):
Если критерий касается исключительно сгенерированного кода, то дискуссия вообще не о том.


Забавно, Вы вклинились в тему и дискуссию, в самом ее разгаре, и, сходу оседлав своего любимого "локального" конька, теперь заявляете, что сама дискуссия, видите ли, "не о том".

ArtemKAD писал(а):
Как по мне конкретно этот пример не слишком понятнее чем


Вот то-то и оно. Вкусовщина. В Форте ведь вообще много странностей, с точки зрения популярных ЯП. Давайте все "исправим". Или могу подсказать Вам несколько языков, где "локалсы" очень органично смотрятся, а не являют собой "костыль", как в Форте. Вон, в Forth 200x придумывают очередной вариант locals. Антон Эртл в одной из статей о локальных переменных отзывается, как о перегруженных ограничениями и одном из слабейших элементов текущего стандарта. Не говоря уже о том, что 99% фортеров, включая автора языка, вообще полностью обходят стороной эту, чужеродную вычислительной модели Форта, конструкцию. Но о локальных переменных разумно говорить в соответствующей теме. Кстати, если Вы из тех, кто в любой форумной дискуссии пытается любой ценой оставить за собой последнее слово, то я легко предоставлю такую возможность.

ArtemKAD писал(а):
формальное правило заставило описывать, что с первым и вторым элементом ничего не произошло...

Вот это уже по существу! На этот случай нотацию можно доработать примерно в таком духе. Если уж очень хочется.
Код:
: count> ( x array - x count)
   0 swap each: { x count element -.. x} > if 1+ then ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу Пред.  1 ... 20, 21, 22, 23, 24, 25, 26, 27  След.

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


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

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


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

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