Forth
http://fforum.winglion.ru/

расширенные операторами стековые манипуляторы
http://fforum.winglion.ru/viewtopic.php?f=2&t=2740
Страница 1 из 27

Автор:  chess [ Пн июл 11, 2011 16:59 ]
Заголовок сообщения:  расширенные операторами стековые манипуляторы

Позволяют быстро набросать и отладить набор процедур для произвольной задачи.

Код:
\ расширенные операторами стековые манипуляторы ( в основном для отладки)

: [M] ( a u -- MAX ) u! a!  0   a u + a DO I C@ MAX LOOP ;
: [m] ( a u -- MIN ) u! a! 0xFF a u + a DO I C@ MIN LOOP ;
: sqrt ( n -- sqrtn) $ -4 @P=A $ -4 0=@P 0SQRT $ -4 @P=0-  $ -4 A=@P ;

: operations? ( sym -- tf )
  CASE
  '+' OF +   0 ENDOF '-' OF -    0 ENDOF '*' OF *    0 ENDOF '/' OF /      0 ENDOF '%' OF MOD  0 ENDOF '_' OF NEGATE 0 ENDOF 'a' OF ABS 0 ENDOF
  '|' OF OR  0 ENDOF '^' OF XOR  0 ENDOF '&' OF AND  0 ENDOF '~' OF INVERT 0 ENDOF '}' OF RSHIFT 0 ENDOF '{' OF LSHIFT 0 ENDOF
  '>' OF >   0 ENDOF '<' OF <    0 ENDOF '=' OF =    0 ENDOF 'M' OF MAX    0 ENDOF 'm' OF MIN  0 ENDOF
  '!' OF !   0 ENDOF '@' OF @    0 ENDOF 'w' OF C!   0 ENDOF 'r' OF C@     0 ENDOF 'W' OF W!   0 ENDOF 'R' OF W@     0 ENDOF
  'd' OF DUP 0 ENDOF 'x' OF DROP 0 ENDOF 'D' OF 2DUP 0 ENDOF 'X' OF 2DROP  0 ENDOF ']' OF [M]  0 ENDOF '[' OF [m]    0 ENDOF  's' OF sqrt 0 ENDOF
1 ENDCASE ;

: SPDROP ( p*n n --)  $ 2 #A<< P+A DROP ;
: SPMOVE ( p*n addr n --) $ 4 B=aP D=@P L1: C=@B @D=C $ 4 Da $ 4 Ba A-- L1 J0<> 2DROP ;
: SPREV  ( p*n n -- p'*n) A-- D=P $ 2 #A<< A+D L1: B=@D C=@A @A=B @D=C $ 4 Da $ -4 Aa A=D? L1 J>= DROP ;

: NOTFOUND ( A U -- )
2DUP 1 > >R C@ '0' - 1 10 WITHIN >R OVER 1+ C@ '\' = 2R> AND AND 0=
IF   NOTFOUND EXIT
ELSE u! a! 100 sp] 0 Lb!
     ss( is u is a a C@ '0' - is Lb Lb SPREV sp Lb SPMOVE Lb SPDROP
      a u + a 2+ ?DO I C@  operations? IF I C@ '0' - 1- CELLS sp + @ THEN LOOP )
     STATE @ IF a u SLIT, l' ss LIT, EXECUTE, ELSE a u ss THEN
THEN ;

\ Примеры
STARTLOG
\ обрезать строку спереди
: /str ( a u n -- a+n u-n ) 3\13+23- ;

\ обрезать строку спереди и сзади
: /str/ ( a u n1 n2 -- a+n1 u-n1-n2 ) 4\13+23-4- ;   S" abcdtf"  2 2 /str/ TYPE CR

: arr ( -- a u)  200 a]  a 200 222 FILL 123 a 100 + C! 246 a 120 + C!  a 200 ;

\ найти максимальный байт в массиве arr
arr 2\12] .

: гипотенуза ( a b -- c ) 2\11*22*+s ;   123 456 гипотенуза .

: Sтреуг ( a b c -- S ) 2 4\123123++4/ 4\441-*42-*43-*s ;  50 60 70 Sтреуг .

Автор:  Удивленный [ Пн июл 11, 2011 17:19 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

И как, удобно вот таким языком пользоваться?
Код:
4\123123++4/

Автор:  chess [ Пн июл 11, 2011 20:30 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Удивленный писал(а):
И как, удобно вот таким языком пользоваться?

Как это не удивительно - удобно.
Кроме исключения стековых манипуляций работает "эффект видеобуфера" - это идея из
таких языков как APL, J, K.
Параметры переходят из поля внимания в поле зрения( как и операторы) - этим высвобождается объем внимания.
Для сравнения площадь треугольника(формула Герона) в стандартном виде:
Код:
: Sтреуг (a b c -- S )
2DUP 2>R ROT DUP >R + + 2/ DUP DUP R> - SWAP DUP R> - SWAP R> -  * * * SQRT ;

Так что проще?

Автор:  Фортранщик [ Вт июл 12, 2011 09:45 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Формула Герона проще всего. :)
P=(A+B+C)/2
S=SQRT(P*(P-A)*(P-B)*(P-C))

Автор:  chess [ Вт июл 12, 2011 10:12 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Фортранщик писал(а):
Формула Герона проще всего. :)P=(A+B+C)/2S=SQRT(P*(P-A)*(P-B)*(P-C))

А что в Фортране не надо объявлять переменные P, A, B, C, S ?
Приведите весь текст.
В Форте так тоже можно(с лок. переменными), но длинней чем со стековыми манипуляторами, а по сравнению с Фортраном скобок нет ни разу:
Код:
: S ( a b c -- S) a! b! c! a b c + + 2/ p! p p a - * p b - * p c - * SQRT ;

Автор:  Лесник [ Вт июл 12, 2011 10:35 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Уважаемый chess, если цель программирования экономить бумагу, место на экране и нажатия кнопок, то таки да: стековые манипуляторы круче всего.
Но сдается мне, легкочитаемость программы (и легкозаписываемость выражений) важнее.

Автор:  chess [ Вт июл 12, 2011 11:12 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Лесник писал(а):
Но сдается мне, легкочитаемость программы (и легкозаписываемость выражений) важнее.

Легкочитаемость или легкозаписываемость - что важнее. Важнее второе. Форт ориентирован на создание языков предметных
областей. Специалист в предметной области правильно "обзовет" ряд понятий этой области чтобы решать задачи касаемые этой области вот и снимется трудность "читаемости". Насчет стековых манипуляторов - это технологический прием и только.
Построение Форта во многом следует принципу бритвы Оккама - не умножать сущности.
Вот к примеру насчет площади треугольника, как бы это не было тривиально.
Дано: длины трех сторон. Найти площадь. Зачем нам какие-то промежуточные переменные, нам же нужна только площадь.
Необходимости именовать параметры нет. Манипуляторы позволяют это сделать. Классический форт тоже, но с доп. нагрузкой
на объем внимания по сравнению с манипуляторами.
Модель для программиста на стековом языке проста:
Если манипулятор работает, например, с 5 параметрами, то они представляются на стеке номерами 1 2 3 4 5, самый нижний 1,
самый верхний 5.
Например надо сравнить разницу длин двух строк с каким-то пороговым числом:
Код:
: dLStr>limit ( a1 u1 a2 u2 limit -- true/false)
  5\24-a5> ;

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

Автор:  Hishnik [ Вт июл 12, 2011 12:12 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

chess писал(а):
Читается как разница длины первой и второй строк по абсолютной величине больше порога?

Читается как "24-й элемент 5-й структуры переместить в координаты a5"

Автор:  Antender [ Вт июл 12, 2011 13:15 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

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

Автор:  chess [ Вт июл 12, 2011 13:21 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Хищник писал(а):
Читается как "24-й элемент 5-й структуры переместить в координаты a5"

Ну это если не уметь читать на этом поддиалекте. :)
Вход в синтаксис стековых манипуляторов(которые суть - разновидность комбинаторов) осуществляется через заголовок
манипулятора вида 'n\' , где n - символ цифры от 1 до 9(можно без проблем увеличить до f).
Эта цифра показывает с каким количеством параметров на вершине стека параметров работает манипулятор.
Это количество параметров снимается со стека и где-то временно запоминается. В дальнейшем эти параметры доступны
по своим номерам. Если скажем написать манипулятор 8\ , то со стека будет снято 8 параметров, и если например на стеке
было перед исполнением манипулятора 8\ только 5 параметров, то будет ошибка переопустошения стека.
Номер параметра растет снизу вверх - на вершине самый большой номер, внизу - номер 1.
Исходя из вышесказанного можно для примера переопределить фортовские процедуры работы со стеком или ввести новые:
: dup 1\11 ;
: drop 1\ ;
: 2dup 2\1212 ;
: 2drop 2\ ;
: swap 2\21 ;
: over 2\121 ;
: 3dup 3\123123 ;
: 3rev 3\321 ;
: dup2 1\111 ;
...
: 2rot 6\345612 ;
В режиме интерпретации они тоже работают в виде 3\21 - вместо параметров 1 2 3 будут параметры 2 1.
В соответствии с обратной польской записью параметры могут обрабатываться стандартными одноместными и двухместными операторами и спец. процедурами в виде соответствующих символов из набора, приведенного в слове operations? При необходимости этот набор можно дополнять.
Операции над параметрами работают аналогично фортовским, сложение заменяет 2 параметра на 1(сумму)
4\423+ ( 1 2 3 4 --> 4 2+3 )
5\15-a5 ( 1 2 3 4 5 --> |1-5| 5 )

Вот и все описание синтаксиса расширенных стековых манипуляторов.
Хищник писал(а):
chess писал(а):Читается как разница длины первой и второй строк по абсолютной величине больше порога?

Автор:  Antender [ Вт июл 12, 2011 14:59 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Единственное, что смущает - это плюсы и минусы. ИМХО, они там не нужны. А вообще идея напоминает множественное присваиваниие, только без имён.

Автор:  chess [ Вт июл 12, 2011 15:19 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Antender писал(а):
Единственное, что смущает - это плюсы и минусы. ИМХО, они там не нужны. А вообще идея напоминает множественное присваиваниие, только без имён.

Что за плюсы и минусы? Если это операторы + и - , то непонятно о чем вы.

Вот ссылка на spf "понимающий" встроенный асм, локальные слова, макросы и расширенные стековые манипуляторы.
http://file.qip.ru/file/tO0V8FM8/spf419mals.html

Попробуйте поработать со стековыми манипуляторами. Они сочетаются со всем вышеописанным и с классическим Фортом.

Автор:  chess [ Вт июл 12, 2011 16:45 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Antender писал(а):
Единственное, что смущает - это плюсы и минусы. ИМХО, они там не нужны. А вообще идея напоминает множественное присваиваниие, только без имён.

А, дошло. Раньше я тоже так думал. Были просто стековые манипуляторы без операций над параметрами - стексы.
Если использовать только стексы, то кода будет гораздо больше, так как нужно гораздо больше манипулировать параметрами на стеке чем при расширении манипуляторов операторами.
Каждый манипулятор работает с "моментальным снимком" стека. Исходные параметры при этом неизменны. С результатами
обработки параметров операторами можно дальше работать в пределах манипулятора, но результаты уже не нумеруются.
Такой вид представления процедур удобен еще тем, что может автоматически обрабатываться на предмет раздачи отдельных кусков кода манипулятора для независимого параллельного выполнения отдельными процессорами многопроцессорной структуры, когда за такт выполнится много операций в разных процессорах.

Автор:  Antender [ Вт июл 12, 2011 19:24 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

А можно немного изменить работу этих манипуляторов?
добавить пробелы между отдельными операциями для лучшей читаемости
(т.е. обернуть их парой слов :МАНИПУЛЯТОРЫ МАНИПУЛЯТОРЫ;)
и добавить выполнение любых слов, а не только встроенных заранее
(т.е. не только + -)

Автор:  chess [ Вт июл 12, 2011 20:05 ]
Заголовок сообщения:  Re: расширенные операторами стековые манипуляторы

Antender писал(а):
А можно немного изменить работу этих манипуляторов?

Реализация того, что сделано уместилась в 20 строк. А это ваше "немного" потребует гораздо больших затрат. Полезный результат будет незначителен.
Я сравниваю использование манипуляторов с конструкциями языка J - манипуляторы проще на порядок. Кроме того растягивание выражений уменьшает эффект видеобуфера. Короче проще привыкнуть. Если есть интерес попробуйте сделать сами. В целом это несложно, но долго.

Страница 1 из 27 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/