Forth http://fforum.winglion.ru/ |
|
расширенные операторами стековые манипуляторы http://fforum.winglion.ru/viewtopic.php?f=2&t=2740 |
Страница 25 из 27 |
Автор: | ArtemKAD [ Сб дек 29, 2012 15:52 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
true-grue писал(а): Но Ваша точка зрения, не признавать _ничего_, кроме locals, мне непонятна. Телепат? Может еще чего расскажете о МОЕЙ ТОЧКЕ ЗРЕНИЯ - мне самому интересно? true-grue писал(а): Чем моя конструкция помешает лично Вам? Она мне мешает? true-grue писал(а): ArtemKAD писал(а): И что поменялось? Ввели еще одно правило не убрав суть. Суть (читаемый код) и должна сохраняться. Моя конструкция понуждает разработчика документировать код и это ее свойство я считаю ключевым. Вот это самое принуждение без существенных преимуществ и не даст в дальнейшем ею пользоваться. ЗЫ. Суть неудобства/проблемы. true-grue писал(а): Я не помню точной хронологии изобретений г-на chess'а, но он уже давно пришел к варианту "3\1231". Возможно и отстал... Хорошо, пусть будет такой вариант. Вот только дальше любопытнее... Вот это отличный вариант - простой, наглядный и функциональный как все DUP,DROP,SWAP,ROT,NIP вместе взятые, но на это надо остановиться. Иначе из трех преимуществ останется только одно. Не стоит дальше этот простой молоток превращать в ЧПУ-станок т.к. молотком может воспользоваться каждый, а вот ЧПУ требует длительного обучения... А с учетом того, что любители ЧПУ предпочитаю не Форт, а чего посерьезней, тут оно не приживется. |
Автор: | true-grue [ Сб дек 29, 2012 16:24 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
Давайте проследим историю "конфликта". Исходный вариант от dynamic-wind. Код: : appIf ( predxt opxt array --) each: dup где-чёртов-predxt pick execute if где-чёртов-opxt pick execute else drop then ; Манипуляторы. Код: : appIf ( pred op array) each: 3\12331 execute if 3\1232 execute else drop then ; Понятно, что можно сделать еще "манипуляторнее", но идея и так ясна. Мой вариант. Код: : appIf ( pred op array) each: { pred op element - .. element pred} execute if { pred op element - .. op} execute else drop then ; Локальные переменные. Код: Решение не было предложено. Если кое-кто захочет дать решение, пусть не забудет заодно и про count>. Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код. Поэтому я и предложил свой вариант. По моему опыту, в долгосрочной перспективе наиболее окупаются те языковые решения, которые принуждают программиста к ясности и порядку. Простой пример -- отступы в Python. Уж сколько ругались на эти отступы! Но то, что в результате программа, во многом, выглядит, как псевдокод, дорогого стоит. А слова про "неудобства/проблемы" и "не даст в дальнейшем ею пользоваться" -- чушь. Генератор стековых перестановок -- такая же старая идея в Форте, как и те же локальные переменные. Разные вариации этой идеи присутствуют и в других форт-подобных языках. Если же Вы, ArtemKAD, говорили о себе и своем личном нежелании пользоваться этой конструкцией, то добавляйте "imho". Мне этого будет вполне достаточно. Лично Вас агитировать использовать эту конструкцию я с самого начала не собирался. |
Автор: | WingLion [ Сб дек 29, 2012 16:41 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
mOleg писал(а): я пока вот вижу одно полезное применение подобного механизма, если он позволит легко описывать базовые операции (примитивы) для вновь создаваемой форт-системы. Это было бы очень полезно, не залазя в дебри опкодов процессора описывать базовые понятия. а сам этот механизм без опкодов как запускать в новой форт-системе? |
Автор: | Hishnik [ Сб дек 29, 2012 16:53 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
ArtemKAD писал(а): А это надо? Насколько помню ни одна из команд манипулирующих стеком не добавляет туда числа. Ведь там где число, там должно быть и слово. А тогда что прикажете делать если слова a b c уже существуют - a b c это тогда манипуляция стеком или вызов уже существующего слова??? Может не стоит превращать хорошую (и главное - простую) идею снова в монстра как это получилось у chess ? Внутри скобок - манипуляция стеком. Слова Форта обычно пишутся в верхнем регистре или в Java-стиле ("СловоМоейПрограммы"). По поводу добавления чисел - мы ради удобства делаем расширения или для добавления неких абстрактных пунктов в список features? Да, манипуляции стеком, а конкретно - приведение стека в нужный вид, являются одной из важных задач в Форте, которая потенциально вызывает проблемы при отладке программ. Устранять проблемы можно разными способами, но эти способы должны разгружать программиста, а не стягивать на себя дополнительное внимание. ArtemKAD писал(а): И в английском не говорят. Говорящие только DUP DROP и SWAP (за что ИМХО и используются больше остальных). Остальные более чем спорны. Именно так. Что красиво выглядит, то и используется. Значит, надо делать красиво выглядящим, а не эффектным внутри. ArtemKAD писал(а): Для следующей подобной, но не такой перестановки будет это-же слово или придумаете другое ? Другое, разумеется. Не вижу тут проблемы. Еще раз - нет задачи сделать вычурно или эпатировать окружающих. Программисту должно быть удобно думать над сутью программы, а не следить, всем ли авторитетам он потрафил. |
Автор: | mOleg [ Сб дек 29, 2012 18:58 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
WingLion писал(а): а сам этот механизм без опкодов как запускать в новой форт-системе? понятия не имею но, согласись, что, если бы можно было начать написание новой системы с: : DUP { n1 --> n1 n1 } ; : DROP { n1 --> } ; : SWAP ( n1 n2 --> n2 n1 } ; то было бы очень удобно. т.е. подобный механизм создания примитивов без погружения в новый ассемблер и прочие прелести |
Автор: | WingLion [ Сб дек 29, 2012 19:03 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
mOleg писал(а): то было бы очень удобно. т.е. подобный механизм создания примитивов без погружения в новый ассемблер и прочие прелести да, конечно... но это та похоже на сказочное "горшочек, вари!", что выглядит как мечта о невозможном |
Автор: | Alex [ Сб дек 29, 2012 19:42 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
предлагаю для разделение частей при неизменном стеке использовать == а слово .. задействовать как предлагал true-grue. то есть .. извлекает весь входной кадр, правильно? Код: S" sm.f" INCLUDED
CREATE buf 640 ALLOT VARIABLE wrd VARIABLE sym : sym+ ( char -- ) buf C@ 1+ DUP buf C! buf + C! ; : wrd! ( a u -- ) wrd @ 1+ wrd ! buf wrd @ 64 * + 2DUP C! 1+ SWAP CMOVE ; : <..> ( a u -- ) S" .." COMPARE 0= IF wrd @ 1+ 1 ?DO I 48 + sym+ LOOP THEN ; : fnd! ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I 64 * buf + DUP C@ 1 0 D+ COMPARE 0= IF I 48 + sym+ LEAVE THEN LOOP <..> ; : mid? ( a u -- a u ? ) 2DUP 2DUP S" -" COMPARE -ROT S" ==" COMPARE AND ; : <NextWord> ( -- a u ) BEGIN NextWord DUP 0= WHILE DROP 2DROP REFILL REPEAT ; : { ( === преобразавать текст внутри { ..... } в стековый манипулятор === ) buf 640 BL FILL 0 wrd ! 2 buf C! BEGIN <NextWord> mid? WHILE wrd! REPEAT NIP 1 = IF [CHAR] \ ELSE [CHAR] | THEN buf 2+ C! wrd @ 48 + buf 1+ C! BEGIN <NextWord> 2DUP S" }" COMPARE WHILE fnd! REPEAT 2DROP buf COUNT S" NOTFOUND" SFIND DROP EXECUTE ; IMMEDIATE : 2dup_1 { a b - .. .. } ; : 2dup_2 { a b == .. } ; : test1 1 2 2dup_1 ; \ результат test1 ( 1 2 1 2 ) : test2 1 2 2dup_2 ; \ результат test2 ( 1 2 1 2 ) : 3dup { a b c == .. } ; : test3 1 2 3 3dup ; \ результат test3 ( 1 2 3 1 2 3 ) |
Автор: | true-grue [ Сб дек 29, 2012 19:59 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
Alex писал(а): предлагаю для разделение частей при неизменном стеке использовать == а слово .. задействовать как предлагал true-grue. то есть .. извлекает весь входной кадр, правильно? Я думаю, Вы и сами видите, что таким образом мы запутываем читающего нашу нотацию разработчика. Я понимаю, что == пришлось ввести для более эффективной компиляции в манипуляторы, но при этом мы теряем смысл надстройки: простая и вполне читаемая нотация начинает обрастать разнообразными вариантами, правилами пользования, нюансами... |
Автор: | chess [ Сб дек 29, 2012 20:01 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
true-grue писал(а): Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код. Манипуляторы это write-only код? Write-only код это программы на J. А у вас иллюзии. |
Автор: | true-grue [ Сб дек 29, 2012 20:10 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
chess писал(а): true-grue писал(а): Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код. Манипуляторы это write-only код? Write-only код это программы на J. А у вас иллюзии. А программист на J обругал бы Вас и добавил, мол, даже не смейте сравнивать эти свои жалкие манипуляторы "от сохи" с красивой математической нотацией! А программист на одном из популярных языков с недоумением бы выразился в том смысле, что для него и разницы нет, что APL, что Forth -- не синтаксис, а сплошные помехи на линии. Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами |
Автор: | Alex [ Сб дек 29, 2012 20:24 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
ну да правильно, если надо сохранить стек, просто пишем после разделителя - слово .. Код: S" sm.f" INCLUDED
CREATE buf 640 ALLOT VARIABLE wrd VARIABLE sym : sym+ ( char -- ) buf C@ 1+ DUP buf C! buf + C! ; : wrd! ( a u -- ) wrd @ 1+ wrd ! buf wrd @ 64 * + 2DUP C! 1+ SWAP CMOVE ; : <..> ( a u -- ) S" .." COMPARE 0= IF wrd @ 1+ 1 ?DO I 48 + sym+ LOOP THEN ; : fnd! ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I 64 * buf + DUP C@ 1 0 D+ COMPARE 0= IF I 48 + sym+ LEAVE THEN LOOP <..> ; : <NextWord> ( -- a u ) BEGIN NextWord DUP 0= WHILE DROP 2DROP REFILL REPEAT ; : { ( === преобразавать текст внутри { ..... } в стековый манипулятор === ) buf 640 BL FILL 0 wrd ! 2 buf C! [CHAR] \ buf 2+ C! BEGIN <NextWord> 2DUP S" -" COMPARE WHILE wrd! REPEAT 2DROP wrd @ 48 + buf 1+ C! BEGIN <NextWord> 2DUP S" }" COMPARE WHILE fnd! REPEAT 2DROP buf COUNT S" NOTFOUND" SFIND DROP EXECUTE ; IMMEDIATE : 2dup { a b - .. .. } ; : test1 1 2 2dup ; \ результат test1 ( 1 2 1 2 ) : 3noop { a b c - .. } ; : test2 1 2 3 3noop ; \ результат test2 ( 1 2 3 ) |
Автор: | ArtemKAD [ Сб дек 29, 2012 20:50 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
true-grue писал(а): Давайте проследим историю "конфликта". Исходный вариант от dynamic-wind. Код: : appIf ( predxt opxt array --) each: dup где-чёртов-predxt pick execute if где-чёртов-opxt pick execute else drop then ; Манипуляторы. Код: : appIf ( pred op array) each: 3\12331 execute if 3\1232 execute else drop then ; Понятно, что можно сделать еще "манипуляторнее", но идея и так ясна. Мой вариант. Код: : appIf ( pred op array) each: { pred op element - .. element pred} execute if { pred op element - .. op} execute else drop then ; Локальные переменные. Код: Решение не было предложено. Так и быть, если желаете: Код: : runIf { pred op element -- pred op } element pred execute if element op execute then pred op ; : appIf ( pred op array -- ) each: runIf ; true-grue писал(а): Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код. Не знаю какой там "write-only", но для того, что-бы понять что конкретно происходит со стеком в конкретно этом примере я использовал именно вариант с манипуляторами - для меня там нагляднее . true-grue писал(а): Разные вариации этой идеи присутствуют и в других форт-подобных языках. Если же Вы, ArtemKAD, говорили о себе и своем личном нежелании пользоваться этой конструкцией, то добавляйте "imho". Мне этого будет вполне достаточно. Лично Вас агитировать использовать эту конструкцию я с самого начала не собирался. Ну что-ж - время покажет. ИМХО простейший вариант манипулятора в Форте очень вероятно, что приживется. А вот скобочная именная перестановка - очень сильно сомневаюсь. |
Автор: | chess [ Сб дек 29, 2012 21:14 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
true-grue писал(а): Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами Их как раз только ленивые и обругали(по-вашему это ветряные мельницы). Те кто не удосужились разобраться с достаточно примитивным технологическим приемом конверсии сложности одного вида в другой(сложность при этом не меняется в количественном выражении), более подходящий для восприятия программистом. Это не всегда возможно, и как говорил Хокинг, сложность будущих задач не сможет быть преодолена только людьми, понадобится связка человека с машиной. Насчет J - засилье восприятия программы при сознательно усиленной зависимости(авторами) от текущего контекста, напрягает уже и в общении на естественном языке( отсюда терминологические споры, ошибки восприятия от неверно впитанного текущего контекста и все такое прочее ). |
Автор: | Zinger [ Сб дек 29, 2012 23:24 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
true-grue писал(а): Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами +1 Да, блевонтина редкостная (пожалуй, я бы высказался значительно крепче, но у нас же не имиджборд). Впрочем, я бы с удовольствием ещё послушал мантры этого унылого пассажира о том, что все кругом живут в иллюзии - это немало забавляет. С другой стороны, может это такой хитроумный pr? Типа штурмовая атака в поисках сторонников с гимном "ветер в лицо, но я всё равно иду"... ) |
Автор: | ArtemKAD [ Вс дек 30, 2012 01:54 ] |
Заголовок сообщения: | Re: расширенные операторами стековые манипуляторы |
Zinger писал(а): true-grue писал(а): Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами +1 Да, блевонтина редкостная (пожалуй, я бы высказался значительно крепче, но у нас же не имиджборд). Впрочем, я бы с удовольствием ещё послушал мантры этого унылого пассажира о том, что все кругом живут в иллюзии - это немало забавляет. А давайте я Вам эти мантры пропою. Только не о том монстре что получился, а о изначальной идее откуда он родился и которая все еще является его составляющей. А идея проста: Очень часто в Форте приходится делать вподряд несколько операций над содержимым стека с одной единственной целью - вытащить из глубины стека на вершину стека одну или несколько ячеек для того, что-бы скормить их некоему слову. Обычно это выглядит а-ля так: R> ROT DUP Тут еще и стек возвратов использовался как временно хранилище(костыль) для некоего параметра который иначе из под вороха сверху накладенного очень весело было-бы доставать. Смысл всех этих операций - из некоего текущего стекового кадра так перетасовать параметры, что-бы получить другой, требуемый здесь и сейчас. Т.е. к примеру надо сделать операцию над стеком единственный результат которой выглядит так ( a b c -- a b c a b ) или если вместо букв написать цифрами ( 1 2 3 -- 1 2 3 1 2 ) Исходное состояние стека записывается всегда в одном порядке который определяется исключительно числом элементов начального стекового кадра которые мы собрались переставлять. Поэтому если записать вместо 1 2 3 просто 3 понимая под этой цифрой только число начальных элементов суть сильно не изменится ( 3 -- 1 2 3 1 2 ) Так понятно записано? Понятно, что это записано изначальное желание - еще до того, как начать думать какими из имеющихся перестановок его можно сделать мы желаем получить имеенно такой результат => вытащить два числа из под вершины стека - типовой пример для операции сравнения по результатам которой надо что-то сделать с тремя оставшимися параметрами. Это была призказка ... А теперь суть идеи - а давайте вместо того, что-бы думать какими существующими перестановками сделать желаемое, запишем это желание сразу одним словом которое это желание и совершит. У chess-манипуляторов для выше приведенного примера выглядит буквально выбрасыванием всего лишнего: 3/12312 Надеюсь что означает такая запись и почему она именно такая понятно? Над формой записи можно спорить, можно спорить о ее реализации, но эти 6 цифр являются простым, логичным, понятным и мощным инструментом работы со стеком. Я не прав? ЗЫ. Ну а дальше chess понесло - он решил отказаться от "простой, логичный, понятный" сосредоточившись на "мощный". Результат, как говорится, на лице. |
Страница 25 из 27 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |