Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
Написал свою маленькую версию в 40 строк. Можно манипулировать максимум 5 элементами стека Пока только перестановка. пример 3/1032 соответствует коду 2swap Верхний элемент обозначается нулём. Читал где-то тут на форуме вариант chess-а с ограничением в 4 элемента стека. Грубо говоря, он и есть только в несколько другом исполнении. Планирую добавить подвыражения. Типа 2/10(21+)2 20 30 40 -- 30 40 50 короче, полный hello lisp будет
Написал свою маленькую версию в 40 строк. Можно манипулировать максимум 5 элементами стека Пока только перестановка. пример 3/1032 соответствует коду 2swap Верхний элемент обозначается нулём. Читал где-то тут на форуме вариант chess-а с ограничением в 4 элемента стека. Грубо говоря, он и есть только в несколько другом исполнении. Планирую добавить подвыражения. Типа 2/10(21+)2 20 30 40 -- 30 40 50 короче, полный hello lisp будет
|
|
|
|
Добавлено: Пт фев 03, 2017 21:16 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
gudleifr писал(а): Alex писал(а): Код: : t1 1 2 3 4 * + - . ; Дык, кратко, суть моих возражений в том, что я крайне редко испытываю потребность в подобных выражениях. Более того, считаю злоупотребление ими плохим стилем программирования. поддерживаю
[quote="gudleifr"][quote="Alex"][code]: t1 1 2 3 4 * + - . ;[/code][/quote]Дык, кратко, суть моих возражений в том, что я крайне редко испытываю потребность в подобных выражениях. Более того, считаю злоупотребление ими плохим стилем программирования.[/quote]
поддерживаю
|
|
|
|
Добавлено: Пн дек 01, 2014 10:54 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
Alex писал(а): Код: : t1 1 2 3 4 * + - . ; Дык, кратко, суть моих возражений в том, что я крайне редко испытываю потребность в подобных выражениях. Более того, считаю злоупотребление ими плохим стилем программирования.
[quote="Alex"][code]: t1 1 2 3 4 * + - . ;[/code][/quote]Дык, кратко, суть моих возражений в том, что я крайне редко испытываю потребность в подобных выражениях. Более того, считаю злоупотребление ими плохим стилем программирования.
|
|
|
|
Добавлено: Пн дек 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 ) и некоторые другие. Хотя в целом старался сохранить максимальную совместимость с оригинальной версией, реализация а) потянула всю эту цепочку...
[quote]2. Можно писать любой язык, так почему выбран такой непонятный? Взяли обычный математический и вперед. Можно даже двумерный, как в Mathematica, TeX или Microsoft Equation...[/quote]
расширенные операторами стековые манипуляторы это [b]особая форма записи форт-кода.[/b]
постараюсь показать на примерах: а) простое арифметическое выражение с печатью результата, [code]: t1 1 2 3 4 * + - . ; : t2 _1234*+-._ ;[/code] чем отличается t2 от t1? нет пробелов и нижнее подчеркивание в начале и конце блока символов, визуально очень похоже, порядок констант и операций один и тот же. б) тоже арифметическое выражение, но с VALUE [code]: 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*+-. ;[/code] немного короче загрузка, а выражение один в один в) цикл DO...LOOP, определим два слова для демонстрации трансформации : D POSTPONE DO ; IMMEDIATE : L POSTPONE LOOP ; IMMEDIATE печатаем индекс цикла [code]: t5 9 0 DO I . LOOP ; : t6 9 0 D I . L ; : t7 _90DI.L_ ;[/code] все три цикла образуют один визуальный ряд, а цикл в манипуляторе выглядит вполне по фортовски г) оператор условного выбора, тоже определим слова для демонстрации : i POSTPONE IF ; IMMEDIATE : e POSTPONE ELSE ; IMMEDIATE : t POSTPONE THEN ; IMMEDIATE тогда получим такой ряд: [code]: t8 0= IF 22 ELSE 33 THEN + . ; : t9 0= i 22 e 33 t + . ; : t10 0= _i"22e"33t+._ ;[/code] д..) Большинство символов обозначающих операторы имеют заметную и/или очевидную визуальную связь со словами форта, или смысловую ассоциацию: [code]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); некоторые слова форта совпадают с символами операторов: ! @ * + - . / < = > [/code]
еще немного примеров можно глянуть здесь https://github.com/kgforth/sm/blob/master/info.txt примеры приведены на крайней версии, которая имеет отличие от реализации chess-a: а) введен контекст в виде чередуемости блоков параметров и блоков команд (осознаю очень спорное предложение, мне кажется улучшает читабельность но требует некоторого внимания и понимания) б) поменялось значение префикса ` теперь именуется префикс альтернативы для поддержки работы блоков и векторов. в) поменялось значение префикса ' теперь префикс дополнительных однобуквенных команд (визуальное соответствие одинарная кавычка = следом один символ команды) г) поменялось значение префикса " теперь префикс двубуквенных команд (визуальное соответствие двойная кавычка = следом два символа команды) д) новый префикс ~ для трехбуквенных команд е) поменялось значение некоторых символов, например ^ (теперь префикс адреса) ? теперь i (для оператора IF ) и некоторые другие. Хотя в целом старался сохранить максимальную совместимость с оригинальной версией, реализация а) потянула всю эту цепочку... :(
|
|
|
|
Добавлено: Вс ноя 30, 2014 21:00 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
Хищник писал(а): В более позднем этих DUP-DROP-SWAP в несколько раз меньше. Это точно. Использование стека по назначению снижает перетасовки очень и очень значительно.
[quote="Хищник"]В более позднем этих DUP-DROP-SWAP в несколько раз меньше.[/quote]Это точно. Использование стека по назначению снижает перетасовки очень и очень значительно.
|
|
|
|
Добавлено: Вт ноя 25, 2014 19:50 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
Я уже упоминал, что как-то попробовал посчитать количество базовых стековых слов в своем коде, разнесенном лет примерно на 10 по времени. В более позднем этих DUP-DROP-SWAP в несколько раз меньше. SWAP, например, нашелся в количестве 6 штук на 1000 строк кода, и то стоял для улучшения читаемости.
Я уже упоминал, что как-то попробовал посчитать количество базовых стековых слов в своем коде, разнесенном лет примерно на 10 по времени. В более позднем этих DUP-DROP-SWAP в несколько раз меньше. SWAP, например, нашелся в количестве 6 штук на 1000 строк кода, и то стоял для улучшения читаемости.
|
|
|
|
Добавлено: Вт ноя 25, 2014 19:29 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
gudleifr писал(а): 4. Хочется добиться совершенства от стека? Дык, он несовершенен по своей природе. И все эти DUP-ы и SWAP-ы от бедности. Вполне адекватное средство Если хочется можно "заменить", например, на ряды языка Euphoria. Транслятор Forth подобного языка Forthec в ассемблерное представление (masm) сделан на Эйфории. Но это, возможно, тема для другого обсуждения P.S. ...
[quote="gudleifr"]4. Хочется добиться совершенства от стека? Дык, он несовершенен по своей природе. И все эти DUP-ы и SWAP-ы от бедности.[/quote] Вполне адекватное средство :) Если хочется можно "заменить", например, на ряды языка 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=3015P.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); }
[quote="Alex"]Зачем понадобилось вводить именованные одним символам векторы и параметры? [/quote]1. FORTH предназначен для написания языков, следовательно, в написании очередного языка нет ничего сложного. Использование NOTFOUND, конечно, говорит о некоторой ограниченности, ну да ладно, так проще и SPF-истеее. 2. Можно писать любой язык, так почему выбран такой непонятный? Взяли обычный математический и вперед. Можно даже двумерный, как в Mathematica, TeX или Microsoft Equation... 3. Хочется оптимизации? Но, ведь, при переводе с одного языка на другой информация теряется, мусор увеличивается... 4. Хочется добиться совершенства от стека? Дык, он несовершенен по своей природе. И все эти DUP-ы и SWAP-ы от бедности. 5. Самое смешное, что если кто-то потребует от Вас написать что-то действительно всерьез считающее, то рано или поздно, Вы напишете пару десятков строк на языке ассемблера. Быстрее и проще. 6. Да и простейшую стековую задачу "про перевозку через реку" на стековых манипуляторах решить не удалось... [url]http://fforum.winglion.ru/viewtopic.php?f=2&t=3015[/url]
P.S. Возьмем например задачу [url=http://www.gudleifr.h1.ru/52.html]"Лунолет"[/url]. Да, конечно, можно расставить в стеке все переменные подряд и их тасовать. Но, посмотрев внимательно, можно видеть, что вычисления распадаются на кирпичики, которые практически замкнуты в своих вычислениях (т.е. по стеку/локальным переменным): ТЯГА, ИНТЕГРИРОВАНИЕ, САМООТКАПЫВАНИЕ... И "цемента" для связывания этих кирпичей нужно совсем немного: [code]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); } [/code]
|
|
|
|
Добавлено: Вт ноя 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 как реальный практик пишущий много на стековых манипуляторах почувствал дисбаланс - в манипуляторах мы можем использовать за сотню команд и операций в то время как доступные данные всего лишь стек и десяток безымянных ячеек. Поэтому пришлось ввести именованные параметры, к тому же именованные параметры выбранные по традициям и смыслу дают возможность легче оставаться в контексте решаемой задачи ("потоке"). Так что достал я свою реализацию стековых манипуляторов и нашел несколько иное решение, если кому интересно можно посмотреть на гитхабе.
Добрый день! прогуливаясь как-то в сентябре по простором гитхаба, наткнулся на [url]https://github.com/chess2007/-chess/blob/master/table-symbols.spf[/url] проект нашего коллеги chess-a (к сожалению и на форуме и на гитхабе chess не появляется уже более года), я обратил внимание на последние изменения. Они мне показались интересными, да и на форуме это не обсуждалось. реализацию можно посмотреть здесь [url]https://github.com/chess2007/-chess/blob/master/LIB/manipulators.spf[/url] Важное дополнение chess назвал так - именованные одним символом векторы и параметры. Он ввел два массива длиной 1024 байт или 256 4-х байтовых слов, и были зарезервированы символы : _ p v для работы с этими массивами. так символы :A означают запись значения со стека в именованный параметр A (или другими словами запись в массив prarr по индексу A), а символы pA означает извлечь из массива параметров значение по индексу A на стек. Аналогично и с векторами. так символы _A означают запись исполняемого токена со стека в именованный вектор A (или другими словами запись в массив векторов xtarr по индексу A), а символы vA означает исполнить вектор A.
Зачем понадобилось вводить именованные одним символам векторы и параметры?
Я думаю chess как реальный практик пишущий много на стековых манипуляторах почувствал дисбаланс - в манипуляторах мы можем использовать за сотню команд и операций в то время как доступные данные всего лишь стек и десяток безымянных ячеек. Поэтому пришлось ввести именованные параметры, к тому же именованные параметры выбранные по традициям и смыслу дают возможность легче оставаться в контексте решаемой задачи ("потоке").
Так что достал я свою реализацию стековых манипуляторов и нашел несколько иное решение, если кому интересно можно посмотреть на [url=https://github.com/kgforth/sm]гитхабе.[/url]
|
|
|
|
Добавлено: Вт ноя 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 ;
все-таки true-grue предлагая свою конструкцию { a b c - c b a } предполагал наверное локальный контекст ее использования, вот хочу предложить конструкцию для аналогичных целей, с использованием глобального контекста. лесикон здесь немножко другой: есть три слова первое слово - инициализация {0}, второе слово - загрузка данных {! ( это аналог части { ..... - ) и третье слово извлечения данных {@ ( а это аналог части - ..... } ) [code]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[/code] конечно получается чуть-чуть длиннее, зато можно более свободно комбинировать [quote]: 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 ;[/quote]
|
|
|
|
Добавлено: Вт янв 15, 2013 12:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
Alex писал(а): тут с одной стороны хочу показать что сама запись расширенных стековых манипуляторов не бог весть какая сложность - просто перевод слов в символы (2-3 символа) Замечу, что в computer science есть такое понятие "болото Тьюринга" (Turing tar pit), которым обозначают языки, на которых "можно сделать все" (т.е. Тьюринг-полные), но на которых ничего интересного делать и не хочется. Стековые манипуляторы представляют собой разновидность большой группы языков, в которые / из которых можно сделать Форт. В рамках такого подхода можно рассмотреть что-то вроде _ вместо DROP, = вместо DUP и <> вместо SWAP. И подвести обоснование в виде графического изображения, схожего с картинкой на стеке после исполнения. Далее пойдут аналогичные рассуждения.
[quote="Alex"]тут с одной стороны хочу показать что сама запись расширенных стековых манипуляторов не бог весть какая сложность - просто перевод слов в символы (2-3 символа)[/quote] Замечу, что в computer science есть такое понятие "болото Тьюринга" (Turing tar pit), которым обозначают языки, на которых "можно сделать все" (т.е. Тьюринг-полные), но на которых ничего интересного делать и не хочется. Стековые манипуляторы представляют собой разновидность большой группы языков, в которые / из которых можно сделать Форт. В рамках такого подхода можно рассмотреть что-то вроде _ вместо DROP, = вместо DUP и <> вместо SWAP. И подвести обоснование в виде графического изображения, схожего с картинкой на стеке после исполнения. Далее пойдут аналогичные рассуждения.
|
|
|
|
Добавлено: Пт янв 11, 2013 16:19 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
тут с одной стороны хочу показать что сама запись расширенных стековых манипуляторов не бог весть какая сложность - просто перевод слов в символы (2-3 символа) а с другой стороны - от конструкции true-grue именование параметров и псевдо форт-код может быть немного читабельнее и самодокументированее стековый манипулятор не исполняется как слово, а идет компиляция кусков кода, соответствующая его символам, и получается глянув в код слова даже трудно отличить - как он скомпилирован - обычным ли образом либо через манипулятор. ну и конечно здесь есть доля ироничного юмора, и Вы верно это подметили
тут с одной стороны хочу показать что сама запись расширенных стековых манипуляторов не бог весть какая сложность - просто перевод слов в символы (2-3 символа) а с другой стороны - от конструкции true-grue именование параметров и псевдо форт-код может быть немного читабельнее и самодокументированее
стековый манипулятор не исполняется как слово, а идет компиляция кусков кода, соответствующая его символам, и получается глянув в код слова даже трудно отличить - как он скомпилирован - обычным ли образом либо через манипулятор.
ну и конечно здесь есть доля ироничного юмора, и Вы верно это подметили :)
|
|
|
|
Добавлено: Пт янв 11, 2013 12:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: расширенные операторами стековые манипуляторы |
|
|
Alex писал(а): псевдо форт код записанный за словом sm{ и оканчивающийся скобкой } будет распечатан в виде стекового манипулятора. То есть теперь можно текст на Форте превратить в эквивалентный манипулятор, который с помощью соответствующей библиотеки превращается в текст на Форте и исполняется. Спрашивается, зачем тогда промежуточное звено в виде манипулятора? Сопутствующий вопрос - а можно ли превращать текст на Форте, к примеру, в иероглифы?
[quote="Alex"]псевдо форт код записанный за словом sm{ и оканчивающийся скобкой } будет распечатан в виде стекового манипулятора.[/quote] То есть теперь можно текст на Форте превратить в эквивалентный манипулятор, который с помощью соответствующей библиотеки превращается в текст на Форте и исполняется. Спрашивается, зачем тогда промежуточное звено в виде манипулятора? :) Сопутствующий вопрос - а можно ли превращать текст на Форте, к примеру, в иероглифы?
|
|
|
|
Добавлено: Пт янв 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 ===
Некоторое ислледовательское и учебное средство ( а может даже скремблер ) псевдо форт код записанный за словом sm{ и оканчивающийся скобкой } будет распечатан в виде стекового манипулятора. входные параметры записываются как осмысленные слова между словом sm{ и словом - не более 9 слов, каждое не длиннее 63 символов. от слова - до закрывающей скобки } находится псевдо форт код, где участвуют входные слова и слова форт-системы и слова подключенных библиотек. На выходе отпечатается строка-манипулятор соответствующая этому коду. длина строки манипулятора до 63 символов. [code] 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[/code] некоторые примитивные примерчики: [quote]=== 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 ===[/quote]
|
|
|
|
Добавлено: Пт янв 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 } . ;
в SPF для уменьшения побочных эффектов из-за глобальности массивов можно их спрятать в модуль (словарь) и использовать совместно с locals.f переименовав слово { в слово {:
[code]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 } . ;[/code]
|
|
|
|
Добавлено: Пн янв 07, 2013 13:43 |
|
|
|
|