Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср авг 24, 2016 00:59

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - расширенные операторами стековые манипуляторы
Автор Сообщение
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
gudleifr писал(а):
Alex писал(а):
Код:
: t1  1 2 3 4 * + - . ;
Дык, кратко, суть моих возражений в том, что я крайне редко испытываю потребность в подобных выражениях. Более того, считаю злоупотребление ими плохим стилем программирования.


поддерживаю
Сообщение Добавлено: Пн дек 01, 2014 10:54
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Alex писал(а):
Код:
: t1  1 2 3 4 * + - . ;
Дык, кратко, суть моих возражений в том, что я крайне редко испытываю потребность в подобных выражениях. Более того, считаю злоупотребление ими плохим стилем программирования.
Сообщение Добавлено: Пн дек 01, 2014 00:09
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Цитата:
2. Можно писать любой язык, так почему выбран такой непонятный? Взяли обычный математический и вперед. Можно даже двумерный, как в Mathematica, TeX или Microsoft Equation...


расширенные операторами стековые манипуляторы это особая форма записи форт-кода.

постараюсь показать на примерах:
а) простое арифметическое выражение с печатью результата,
Код:
: t1  1 2 3 4 * + - . ;
: t2 _1234*+-._ ;

чем отличается t2 от t1? нет пробелов и нижнее подчеркивание в начале и конце блока символов,
визуально очень похоже, порядок констант и операций один и тот же.
б) тоже арифметическое выражение, но с VALUE
Код:
: t3 1 TO a 2 TO b 3 TO c 4 TO d   a b c d * + - . ;
: t4 1 2 3 4 4:abcd,  abcd*+-. ;

немного короче загрузка, а выражение один в один
в) цикл DO...LOOP, определим два слова для демонстрации трансформации
: D POSTPONE DO ; IMMEDIATE
: L POSTPONE LOOP ; IMMEDIATE
печатаем индекс цикла
Код:
: t5  9 0 DO I . LOOP ;
: t6  9 0 D I . L ;
: t7 _90DI.L_ ;

все три цикла образуют один визуальный ряд, а цикл в манипуляторе выглядит вполне по фортовски
г) оператор условного выбора, тоже определим слова для демонстрации
: i POSTPONE IF ; IMMEDIATE
: e POSTPONE ELSE ; IMMEDIATE
: t POSTPONE THEN ; IMMEDIATE
тогда получим такой ряд:
Код:
: t8  0= IF 22 ELSE 33 THEN + . ;
: t9  0=  i 22 e 33 t + . ;
: t10 0= _i"22e"33t+._ ;

д..) Большинство символов обозначающих операторы имеют заметную и/или очевидную
визуальную связь со словами форта, или смысловую ассоциацию:
Код:
BEGIN <--> B; WHILE <--> W; REPEAT <--> R; UNTIL <--> U; но EXECUTE <--> X; MOVE <--> V;
ABS <--> a; DUP <--> d; C@ <--> b (byte); MAX <--> M (M большое); MIN <--> m (M маленькое);
DROP <--> x (символ сброса); 0= <--> Z (Zero); но 0<> <--> z (NO zERO); EXIT <--> ;
>NUMBER <--> #; SFIND <--> $ (похоже на S); AND <--> &; OR <--> |; но TRUE <--> Y (Yes);
некоторые слова форта совпадают с символами операторов: ! @ * + - . / < = >


еще немного примеров можно глянуть здесь https://github.com/kgforth/sm/blob/master/info.txt
примеры приведены на крайней версии, которая имеет отличие от реализации chess-a:
а) введен контекст в виде чередуемости блоков параметров и блоков команд
(осознаю очень спорное предложение, мне кажется улучшает читабельность но
требует некоторого внимания и понимания)
б) поменялось значение префикса ` теперь именуется префикс альтернативы для поддержки
работы блоков и векторов.
в) поменялось значение префикса ' теперь префикс дополнительных однобуквенных
команд (визуальное соответствие одинарная кавычка = следом один символ команды)
г) поменялось значение префикса " теперь префикс двубуквенных команд
(визуальное соответствие двойная кавычка = следом два символа команды)
д) новый префикс ~ для трехбуквенных команд
е) поменялось значение некоторых символов, например ^ (теперь префикс адреса)
? теперь i (для оператора IF ) и некоторые другие.
Хотя в целом старался сохранить максимальную совместимость с оригинальной версией,
реализация а) потянула всю эту цепочку... :(
Сообщение Добавлено: Вс ноя 30, 2014 21:00
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Хищник писал(а):
В более позднем этих DUP-DROP-SWAP в несколько раз меньше.
Это точно. Использование стека по назначению снижает перетасовки очень и очень значительно.
Сообщение Добавлено: Вт ноя 25, 2014 19:50
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Я уже упоминал, что как-то попробовал посчитать количество базовых стековых слов в своем коде, разнесенном лет примерно на 10 по времени. В более позднем этих DUP-DROP-SWAP в несколько раз меньше. SWAP, например, нашелся в количестве 6 штук на 1000 строк кода, и то стоял для улучшения читаемости.
Сообщение Добавлено: Вт ноя 25, 2014 19:29
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
gudleifr писал(а):
4. Хочется добиться совершенства от стека? Дык, он несовершенен по своей природе. И все эти DUP-ы и SWAP-ы от бедности.

Вполне адекватное средство :)
Если хочется можно "заменить", например, на ряды языка Euphoria.
Транслятор Forth подобного языка Forthec в ассемблерное представление (masm) сделан на Эйфории.
Но это, возможно, тема для другого обсуждения :)

P.S. ...
Сообщение Добавлено: Вт ноя 25, 2014 18:46
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Alex писал(а):
Зачем понадобилось вводить именованные одним символам векторы и параметры?
1. FORTH предназначен для написания языков, следовательно, в написании очередного языка нет ничего сложного. Использование NOTFOUND, конечно, говорит о некоторой ограниченности, ну да ладно, так проще и SPF-истеее.
2. Можно писать любой язык, так почему выбран такой непонятный? Взяли обычный математический и вперед. Можно даже двумерный, как в Mathematica, TeX или Microsoft Equation...
3. Хочется оптимизации? Но, ведь, при переводе с одного языка на другой информация теряется, мусор увеличивается...
4. Хочется добиться совершенства от стека? Дык, он несовершенен по своей природе. И все эти DUP-ы и SWAP-ы от бедности.
5. Самое смешное, что если кто-то потребует от Вас написать что-то действительно всерьез считающее, то рано или поздно, Вы напишете пару десятков строк на языке ассемблера. Быстрее и проще.
6. Да и простейшую стековую задачу "про перевозку через реку" на стековых манипуляторах решить не удалось...
http://fforum.winglion.ru/viewtopic.php?f=2&t=3015

P.S. Возьмем например задачу "Лунолет". Да, конечно, можно расставить в стеке все переменные подряд и их тасовать. Но, посмотрев внимательно, можно видеть, что вычисления распадаются на кирпичики, которые практически замкнуты в своих вычислениях (т.е. по стеку/локальным переменным): ТЯГА, ИНТЕГРИРОВАНИЕ, САМООТКАПЫВАНИЕ... И "цемента" для связывания этих кирпичей нужно совсем немного:
Код:
l2()
{
   INPUT
   NOINPUT((dt < t0), "Слишком малое время реакции")
   NOINPUT((dm > (mt + m) / 20), "Слишком большой расход топлива")
   THRUST
   TIMERUN
   VELOCITY(v, (a * cos(al) - g))
   DISTANCE(h, v)
   VELOCITY(u, (a * sin(al)))
   DISTANCE(x, u)
   ALARM(((mt -= dm) < 0), mtnegate)   
   ALARM((h < HNEG), hnegate2)
   STOP((h < HMIN), hzero)
   ALARM((mt == 0), mtzero)
   ALARM(((gma = fabs(a) - gm) > 0), greateg3)
   TIMEOUT
   return (0);
}
Сообщение Добавлено: Вт ноя 25, 2014 13:41
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Добрый день! прогуливаясь как-то в сентябре по простором гитхаба,
наткнулся на https://github.com/chess2007/-chess/blob/master/table-symbols.spf
проект нашего коллеги chess-a (к сожалению и на форуме и на гитхабе chess
не появляется уже более года), я обратил внимание на последние изменения.
Они мне показались интересными, да и на форуме это не обсуждалось.
реализацию можно посмотреть здесь https://github.com/chess2007/-chess/blob/master/LIB/manipulators.spf
Важное дополнение chess назвал так - именованные одним символом векторы и параметры.
Он ввел два массива длиной 1024 байт или 256 4-х байтовых слов, и
были зарезервированы символы : _ p v для работы с этими массивами.
так символы :A означают запись значения со стека в именованный параметр A
(или другими словами запись в массив prarr по индексу A), а символы pA означает
извлечь из массива параметров значение по индексу A на стек. Аналогично и с векторами.
так символы _A означают запись исполняемого токена со стека в именованный вектор A
(или другими словами запись в массив векторов xtarr по индексу A), а символы vA означает
исполнить вектор A.

Зачем понадобилось вводить именованные одним символам векторы и параметры?

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

Так что достал я свою реализацию стековых манипуляторов и нашел несколько
иное решение, если кому интересно можно посмотреть на гитхабе.
Сообщение Добавлено: Вт ноя 25, 2014 08:49
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
все-таки true-grue предлагая свою конструкцию { a b c - c b a }
предполагал наверное локальный контекст ее использования, вот хочу предложить
конструкцию для аналогичных целей, с использованием глобального контекста. лесикон
здесь немножко другой: есть три слова первое слово - инициализация {0}, второе
слово - загрузка данных {! ( это аналог части { ..... - ) и третье слово
извлечения данных {@ ( а это аналог части - ..... } )
Код:
MODULE: voc{}
USER-CREATE /d/ 32 CELLS USER-ALLOT USER-CREATE buf 32 32 * USER-ALLOT   
: !, ( n -- ) 1- CELLS LIT, ['] /d/ COMPILE, ['] + COMPILE, ['] ! COMPILE, ;
: @, ( n -- ) 1- CELLS LIT, ['] /d/ COMPILE, ['] + COMPILE, ['] @ COMPILE, ;
: <..>  ( a u -- ) S" .." COMPARE 0= IF buf @ 1+ buf CELL+ @ DO I @, LOOP THEN ;
: wrd! ( a u -- ) buf 1+! buf buf @ 32 * + 2DUP C! 1+ SWAP CMOVE ;
: fnd! ( a u -- ) buf @ 1+ 1 ?DO 2DUP I 32 * buf + COUNT COMPARE 0= IF I @, 2DROP UNLOOP EXIT THEN LOOP <..> ;
: <NextWord> ( -- a u ) BEGIN NextWord DUP 0= WHILE DROP 2DROP REFILL REPEAT ;
: term? (  -- a u f ) <NextWord> 2DUP S" }" SEARCH NIP NIP 0= ;
: load! ( -- ) buf @ 0 > IF buf CELL+ @ buf @ DO I !, -1 +LOOP THEN ;
: check ( a u -- a u ) S"  ; { {@ {! {0} "  2OVER SEARCH NIP NIP IF ABORT" not correct syntax { }" THEN ;
EXPORT
: {0} buf 32 32 * ERASE  /d/ 32 CELLS ERASE ; IMMEDIATE
: {!  buf @ 1+ buf CELL+ ! BEGIN term? WHILE check wrd! REPEAT 1- wrd! load! ; IMMEDIATE
: {@  BEGIN term? WHILE check fnd! REPEAT 1- fnd! ; IMMEDIATE
;MODULE

конечно получается чуть-чуть длиннее, зато можно более свободно комбинировать
Цитата:
: test-1 { a b c - c b a } ;
: test-2 {! a b c} {@ c b a} ;
: sum>-1 ( sum lev arr - sum ) SWAP { level - } each: DUP {.. - level } > IF + ELSE DROP THEN ;
: sum>-2 ( sum lev arr - sum ) SWAP {! level} each: DUP {@ level} > IF + ELSE DROP THEN ;
Сообщение Добавлено: Вт янв 15, 2013 12:58
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Alex писал(а):
тут с одной стороны хочу показать что сама запись расширенных стековых манипуляторов
не бог весть какая сложность - просто перевод слов в символы (2-3 символа)

Замечу, что в computer science есть такое понятие "болото Тьюринга" (Turing tar pit), которым обозначают языки, на которых "можно сделать все" (т.е. Тьюринг-полные), но на которых ничего интересного делать и не хочется. Стековые манипуляторы представляют собой разновидность большой группы языков, в которые / из которых можно сделать Форт. В рамках такого подхода можно рассмотреть что-то вроде _ вместо DROP, = вместо DUP и <> вместо SWAP. И подвести обоснование в виде графического изображения, схожего с картинкой на стеке после исполнения. Далее пойдут аналогичные рассуждения.
Сообщение Добавлено: Пт янв 11, 2013 16:19
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
тут с одной стороны хочу показать что сама запись расширенных стековых манипуляторов
не бог весть какая сложность - просто перевод слов в символы (2-3 символа)
а с другой стороны - от конструкции true-grue именование параметров и
псевдо форт-код может быть немного читабельнее и самодокументированее

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

ну и конечно здесь есть доля ироничного юмора, и Вы верно это подметили :)
Сообщение Добавлено: Пт янв 11, 2013 12:58
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Alex писал(а):
псевдо форт код записанный за словом sm{ и оканчивающийся скобкой }
будет распечатан в виде стекового манипулятора.

То есть теперь можно текст на Форте превратить в эквивалентный манипулятор, который с помощью соответствующей библиотеки превращается в текст на Форте и исполняется. Спрашивается, зачем тогда промежуточное звено в виде манипулятора? :) Сопутствующий вопрос - а можно ли превращать текст на Форте, к примеру, в иероглифы?
Сообщение Добавлено: Пт янв 11, 2013 12:13
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Некоторое ислледовательское и учебное средство ( а может даже скремблер )
псевдо форт код записанный за словом sm{ и оканчивающийся скобкой }
будет распечатан в виде стекового манипулятора.
входные параметры записываются как осмысленные слова между словом sm{ и словом -
не более 9 слов, каждое не длиннее 63 символов. от слова - до закрывающей скобки }
находится псевдо форт код, где участвуют входные слова и слова форт-системы и
слова подключенных библиотек. На выходе отпечатается строка-манипулятор соответствующая
этому коду. длина строки манипулятора до 63 символов.
Код:
MODULE: vocsm{-}
CREATE buf 640 ALLOT   VARIABLE wrd 
: sym+ ( char -- ) buf C@ 1+ DUP buf C! buf + C! ;
: opr+ ( a u -- ) buf C@ 2DUP + buf C! buf + 1+ SWAP CMOVE ;
: voc? ( a u -- )
       2DUP S" .."        COMPARE 0= IF wrd @ 1+ 1 ?DO I 48 + sym+ LOOP 2DROP EXIT THEN
       2DUP S" D+"        COMPARE 0= IF S" `+"   opr+  2DROP EXIT THEN
       2DUP S" D-"        COMPARE 0= IF S" `-"   opr+  2DROP EXIT THEN
       2DUP S" D="        COMPARE 0= IF S" `="   opr+  2DROP EXIT THEN
       2DUP S" 2@"        COMPARE 0= IF S" `@"   opr+  2DROP EXIT THEN
       2DUP S" 2!"        COMPARE 0= IF S" `!"   opr+  2DROP EXIT THEN
       2DUP S" DNEGATE"   COMPARE 0= IF S" `n"   opr+  2DROP EXIT THEN
       2DUP S" DABS"      COMPARE 0= IF S" `a"   opr+  2DROP EXIT THEN
       2DUP S" 2DUP"      COMPARE 0= IF S" `d"   opr+  2DROP EXIT THEN
       2DUP S" 2DROP"     COMPARE 0= IF S" `x"   opr+  2DROP EXIT THEN
       2DUP S" D."        COMPARE 0= IF S" `."   opr+  2DROP EXIT THEN
       2DUP S" D>S"       COMPARE 0= IF S" `S"   opr+  2DROP EXIT THEN
       2DUP S" S>D"       COMPARE 0= IF S" `D"   opr+  2DROP EXIT THEN
       2DUP S" +"         COMPARE 0= IF [CHAR] + sym+  2DROP EXIT THEN
       2DUP S" -"         COMPARE 0= IF [CHAR] - sym+  2DROP EXIT THEN
       2DUP S" *"         COMPARE 0= IF [CHAR] * sym+  2DROP EXIT THEN
       2DUP S" /"         COMPARE 0= IF [CHAR] / sym+  2DROP EXIT THEN
       2DUP S" MOD"       COMPARE 0= IF [CHAR] % sym+  2DROP EXIT THEN
       2DUP S" /MOD"      COMPARE 0= IF [CHAR] : sym+  2DROP EXIT THEN
       2DUP S" NEGATE"    COMPARE 0= IF [CHAR] n sym+  2DROP EXIT THEN
       2DUP S" ABS"       COMPARE 0= IF [CHAR] a sym+  2DROP EXIT THEN
       2DUP S" OR"        COMPARE 0= IF [CHAR] | sym+  2DROP EXIT THEN
       2DUP S" XOR"       COMPARE 0= IF [CHAR] ^ sym+  2DROP EXIT THEN
       2DUP S" AND"       COMPARE 0= IF [CHAR] & sym+  2DROP EXIT THEN
       2DUP S" INVERT"    COMPARE 0= IF [CHAR] ~ sym+  2DROP EXIT THEN
       2DUP S" RSHIFT"    COMPARE 0= IF [CHAR] r sym+  2DROP EXIT THEN
       2DUP S" LSHIFT"    COMPARE 0= IF [CHAR] l sym+  2DROP EXIT THEN
       2DUP S" !"         COMPARE 0= IF [CHAR] ! sym+  2DROP EXIT THEN
       2DUP S" @"         COMPARE 0= IF [CHAR] @ sym+  2DROP EXIT THEN
       2DUP S" C@"        COMPARE 0= IF [CHAR] b sym+  2DROP EXIT THEN
       2DUP S" C!"        COMPARE 0= IF [CHAR] w sym+  2DROP EXIT THEN
       2DUP S" MOVE"      COMPARE 0= IF [CHAR] V sym+  2DROP EXIT THEN
       2DUP S" FILL"      COMPARE 0= IF [CHAR] F sym+  2DROP EXIT THEN
       2DUP S" ABS "      COMPARE 0= IF [CHAR] a sym+  2DROP EXIT THEN
       2DUP S" NextWord"  COMPARE 0= IF [CHAR] f sym+  2DROP EXIT THEN
       2DUP S" THROW"     COMPARE 0= IF [CHAR] o sym+  2DROP EXIT THEN
       2DUP S" HEREL"     COMPARE 0= IF [CHAR] h sym+  2DROP EXIT THEN
       2DUP S" ="         COMPARE 0= IF [CHAR] = sym+  2DROP EXIT THEN
       2DUP S" >"         COMPARE 0= IF [CHAR] > sym+  2DROP EXIT THEN
       2DUP S" <"         COMPARE 0= IF [CHAR] < sym+  2DROP EXIT THEN
       2DUP S" 0<>"       COMPARE 0= IF [CHAR] z sym+  2DROP EXIT THEN
       2DUP S" 0="        COMPARE 0= IF [CHAR] Z sym+  2DROP EXIT THEN
       2DUP S" MIN"       COMPARE 0= IF [CHAR] m sym+  2DROP EXIT THEN
       2DUP S" MAX"       COMPARE 0= IF [CHAR] M sym+  2DROP EXIT THEN
       2DUP S" WITHIN"    COMPARE 0= IF [CHAR] H sym+  2DROP EXIT THEN
       2DUP S" DUP"       COMPARE 0= IF [CHAR] d sym+  2DROP EXIT THEN
       2DUP S" DROP"      COMPARE 0= IF [CHAR] x sym+  2DROP EXIT THEN
       2DUP S" DEPTH"     COMPARE 0= IF [CHAR] P sym+  2DROP EXIT THEN
       2DUP S" TRUE"      COMPARE 0= IF [CHAR] Y sym+  2DROP EXIT THEN
       2DUP S" FALSE"     COMPARE 0= IF [CHAR] y sym+  2DROP EXIT THEN
       2DUP S" IF"        COMPARE 0= IF [CHAR] i sym+  2DROP EXIT THEN
       2DUP S" ELSE"      COMPARE 0= IF [CHAR] e sym+  2DROP EXIT THEN
       2DUP S" THEN"      COMPARE 0= IF [CHAR] t sym+  2DROP EXIT THEN
       2DUP S" DO"        COMPARE 0= IF [CHAR] D sym+  2DROP EXIT THEN
       2DUP S" ?DO"       COMPARE 0= IF [CHAR] G sym+  2DROP EXIT THEN
       2DUP S" LOOP"      COMPARE 0= IF [CHAR] L sym+  2DROP EXIT THEN
       2DUP S" +LOOP"     COMPARE 0= IF [CHAR] N sym+  2DROP EXIT THEN
       2DUP S" I"         COMPARE 0= IF [CHAR] I sym+  2DROP EXIT THEN
       2DUP S" J"         COMPARE 0= IF [CHAR] J sym+  2DROP EXIT THEN
       2DUP S" LEAVE"     COMPARE 0= IF [CHAR] Q sym+  2DROP EXIT THEN
       2DUP S" BEGIN"     COMPARE 0= IF [CHAR] B sym+  2DROP EXIT THEN
       2DUP S" ACCEPT"    COMPARE 0= IF [CHAR] A sym+  2DROP EXIT THEN
       2DUP S" UNTIL"     COMPARE 0= IF [CHAR] U sym+  2DROP EXIT THEN
       2DUP S" WHILE"     COMPARE 0= IF [CHAR] W sym+  2DROP EXIT THEN
       2DUP S" REPEAT"    COMPARE 0= IF [CHAR] R sym+  2DROP EXIT THEN
       2DUP S" EXIT"      COMPARE 0= IF [CHAR] ; sym+  2DROP EXIT THEN
       2DUP S" CASE"      COMPARE 0= IF [CHAR] C sym+  2DROP EXIT THEN
       2DUP S" ENDCASE"   COMPARE 0= IF [CHAR] E sym+  2DROP EXIT THEN
       2DUP S" OF"        COMPARE 0= IF [CHAR] ( sym+  2DROP EXIT THEN
       2DUP S" ENDOF"     COMPARE 0= IF [CHAR] ) sym+  2DROP EXIT THEN
       2DUP S" ."         COMPARE 0= IF [CHAR] . sym+  2DROP EXIT THEN
       2DUP S" EMIT"      COMPARE 0= IF [CHAR] c sym+  2DROP EXIT THEN
       2DUP S" SPACES"    COMPARE 0= IF [CHAR] S sym+  2DROP EXIT THEN
       2DUP S" TYPE"      COMPARE 0= IF [CHAR] T sym+  2DROP EXIT THEN
       2DUP S" CR"        COMPARE 0= IF [CHAR] \ sym+  2DROP EXIT THEN
       2DUP S" EXECUTE"   COMPARE 0= IF [CHAR] X sym+  2DROP EXIT THEN
       2DUP S" COMPARE"   COMPARE 0= IF [CHAR] q sym+  2DROP EXIT THEN
       2DUP S" SEARCH"    COMPARE 0= IF [CHAR] s sym+  2DROP EXIT THEN
       2DUP S" NEGATE"    COMPARE 0= IF [CHAR] n sym+  2DROP EXIT THEN
       2DUP S" SFIND"     COMPARE 0= IF [CHAR] $ sym+  2DROP EXIT THEN
       2DUP S" AGAIN"     COMPARE 0= IF [CHAR] O sym+  2DROP EXIT THEN
       2DUP S" EVALUATE"  COMPARE 0= IF [CHAR] v sym+  2DROP EXIT THEN
       2DUP S" EKEY"      COMPARE 0= IF [CHAR] K sym+  2DROP EXIT THEN
       2DUP S" KEY"       COMPARE 0= IF [CHAR] k sym+  2DROP EXIT THEN
       2DUP S" COMPILE,"  COMPARE 0= IF [CHAR] , sym+  2DROP EXIT THEN
       2DUP S" >NUMBER"   COMPARE 0= IF [CHAR] # sym+  2DROP EXIT THEN
       2DUP S" 0"         COMPARE 0= IF S" `0"   opr+  2DROP EXIT THEN
       2DUP S" 1"         COMPARE 0= IF S" `1"   opr+  2DROP EXIT THEN
       2DUP S" 2"         COMPARE 0= IF S" `2"   opr+  2DROP EXIT THEN
       2DUP S" 3"         COMPARE 0= IF S" `3"   opr+  2DROP EXIT THEN
       2DUP S" 4"         COMPARE 0= IF S" `4"   opr+  2DROP EXIT THEN
       2DUP S" 5"         COMPARE 0= IF S" `5"   opr+  2DROP EXIT THEN
       2DUP S" 6"         COMPARE 0= IF S" `6"   opr+  2DROP EXIT THEN
       2DUP S" 7"         COMPARE 0= IF S" `7"   opr+  2DROP EXIT THEN
       2DUP S" 8"         COMPARE 0= IF S" `8"   opr+  2DROP EXIT THEN
       2DUP S" 9"         COMPARE 0= IF S" `9"   opr+  2DROP EXIT THEN
2DUP SFIND 0<> IF DROP S" [" opr+ opr+ S" ]" opr+ ELSE 2DROP THEN
;
: wrd! ( a u -- ) wrd @ 1+ wrd ! buf wrd @ 64 * + 2DUP C! 1+ SWAP CMOVE ;
: fnd! ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I 64 * buf + COUNT COMPARE 0= IF I 48 + sym+ 2DROP UNLOOP EXIT THEN LOOP voc? ;
: <NextWord> ( -- a u ) BEGIN NextWord DUP 0= WHILE DROP 2DROP REFILL REPEAT 2DUP TYPE BL EMIT ;
: check1 ( a u -- a u ) S"  } ; sm{  "  2OVER SEARCH NIP NIP IF ABORT" not correct syntax sm{ - }" THEN ;
: check2 ( a u -- a u ) S"  ; sm{  "    2OVER SEARCH NIP NIP IF ABORT" not correct syntax sm{ - }" THEN ;

EXPORT
: sm{      ( === преобразавать псевдо форт-код внутри  sm{ ..... } в стековый манипулятор === )       
  CR ." === inp === " CR ." sm{ " buf 640 BL FILL 0 wrd ! 2 buf C! [CHAR] \ buf 2+ C!
  BEGIN <NextWord> 2DUP S" -" COMPARE WHILE check1 wrd! REPEAT 2DROP wrd @ 48 + buf 1+ C!
  BEGIN <NextWord> 2DUP S" }" COMPARE WHILE check2 fnd! REPEAT 2DROP
  ( buf COUNT S" NOTFOUND" SFIND DROP EXECUTE  \ расскоментировать, если нужна компиляция )
  CR ." === buf === "
  CR buf COUNT TYPE
  CR ." === end === "
;
;MODULE

некоторые примитивные примерчики:
Цитата:
=== inp ===
sm{ высота ширина глубина - высота ширина * глубина * }
=== buf ===
3\12*3*
=== end ===

=== inp ===
sm{ вес_яблок цена_за_кг порог скидка - вес_яблок цена_за_кг * вес_яблок порог > IF скидка - THEN }
=== buf ===
4\12*13>i4-t
=== end ===

: подтянуться ( n -- ) CR ." сделал " . 500 PAUSE ;

=== inp ===
sm{ сколько_раз - сколько_раз 1 ?DO I подтянуться LOOP }
=== buf ===
1\1`1GI[подтянуться]L
=== end ===
Сообщение Добавлено: Пт янв 11, 2013 11:58
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
в SPF для уменьшения побочных эффектов из-за глобальности массивов можно их
спрятать в модуль (словарь) и использовать совместно с locals.f переименовав слово { в слово {:

Код:
MODULE: voc{-}

USER-CREATE /d/ 32 CELLS USER-ALLOT USER-CREATE buf 32 32 * USER-ALLOT   

: !, ( n -- ) 1- CELLS LIT, ['] /d/ COMPILE, ['] + COMPILE, ['] ! COMPILE, ;
: @, ( n -- ) 1- CELLS LIT, ['] /d/ COMPILE, ['] + COMPILE, ['] @ COMPILE, ;
: <..>  ( a u -- ) S" .." COMPARE 0= buf @ buf CELL+ @ <> AND IF buf @ 1+ buf CELL+ @ 1+ 1 MAX ?DO I @, LOOP THEN ;
: wrd! ( a u -- ) buf @ 1+ buf ! buf buf @ 32 * + 2DUP C! 1+ SWAP CMOVE ;
: fnd! ( a u -- ) buf @ 1+ 1 ?DO 2DUP I 32 * buf + COUNT COMPARE 0= IF I @, 2DROP UNLOOP EXIT THEN LOOP <..> ;
: <NextWord> ( -- a u ) BEGIN NextWord DUP 0= WHILE DROP 2DROP REFILL REPEAT ;
: check1 ( a u -- a u ) S"  } ..  ; { {: {.. "  2OVER SEARCH NIP NIP IF ABORT" not correct syntax { - }" THEN ;
: check2 ( a u -- a u ) S"  ; { {: {.. "        2OVER SEARCH NIP NIP IF ABORT" not correct syntax { - }" THEN ;

EXPORT

: {:    buf 32 32 * ERASE  /d/ 32 CELLS ERASE
  BEGIN <NextWord> 2DUP S" -" COMPARE WHILE check1 wrd! REPEAT 2DROP
  buf @ 0 > IF buf CELL+ @ 1 MAX buf @ DO I !, -1 +LOOP THEN
  BEGIN <NextWord> 2DUP S" }" COMPARE WHILE check2 fnd! REPEAT 2DROP
; IMMEDIATE

: {..   buf @ 0 > IF buf @ buf CELL+ ! THEN 
  BEGIN <NextWord> 2DUP S" -" COMPARE WHILE check1 wrd! REPEAT 2DROP
  buf CELL+ @  buf @ < IF  buf CELL+ @ 1+ buf @  DO I !, -1 +LOOP THEN
  BEGIN <NextWord> 2DUP S" }" COMPARE WHILE check2 fnd! REPEAT 2DROP
; IMMEDIATE

;MODULE

: t1 1 2 3 {: a b c - c b a } ;
: t2  {.. - a b c } ;

REQUIRE { locals.f

: t3 5 { tmp -- } tmp . {.. - c } . ;
Сообщение Добавлено: Пн янв 07, 2013 13:43
  Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы  Ответить с цитатой
Alex писал(а):
, тем более что в расширенных стековыми операциями манипуляторах

Каждый раз когда я смотрю в сторону расширенных стековых манипуляторов вспоминаю Броуди:
Вложение:
Сложность или простота.JPG
Сложность или простота.JPG [ 18.71 Кб | Просмотров: 4359 ]
Сообщение Добавлено: Вс янв 06, 2013 13:37

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


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