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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу 1, 2, 3, 4, 5 ... 27  След.
Автор Сообщение
 Заголовок сообщения: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пн июл 11, 2011 16:59 
Не в сети
Аватара пользователя

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

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

: [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треуг .

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пн июл 11, 2011 17:19 
И как, удобно вот таким языком пользоваться?
Код:
4\123123++4/


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пн июл 11, 2011 20:30 
Не в сети
Аватара пользователя

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 09:45 
Формула Герона проще всего. :)
P=(A+B+C)/2
S=SQRT(P*(P-A)*(P-B)*(P-C))


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 10:12 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Фортранщик писал(а):
Формула Герона проще всего. :)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 ;

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 10:35 
Уважаемый chess, если цель программирования экономить бумагу, место на экране и нажатия кнопок, то таки да: стековые манипуляторы круче всего.
Но сдается мне, легкочитаемость программы (и легкозаписываемость выражений) важнее.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 11:12 
Не в сети
Аватара пользователя

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 12:12 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
chess писал(а):
Читается как разница длины первой и второй строк по абсолютной величине больше порога?

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


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

Зарегистрирован: Вс апр 25, 2010 11:14
Сообщения: 200
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Это как регулярные выражения - обычному человеку кажутся набором символов, но после изучения они становятся очень удобным средством для обработки текста.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 13:21 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Хищник писал(а):
Читается как "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 писал(а):Читается как разница длины первой и второй строк по абсолютной величине больше порога?

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


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

Зарегистрирован: Вс апр 25, 2010 11:14
Сообщения: 200
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Единственное, что смущает - это плюсы и минусы. ИМХО, они там не нужны. А вообще идея напоминает множественное присваиваниие, только без имён.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 15:19 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Antender писал(а):
Единственное, что смущает - это плюсы и минусы. ИМХО, они там не нужны. А вообще идея напоминает множественное присваиваниие, только без имён.

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 16:45 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Antender писал(а):
Единственное, что смущает - это плюсы и минусы. ИМХО, они там не нужны. А вообще идея напоминает множественное присваиваниие, только без имён.

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

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


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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вт июл 12, 2011 20:05 
Не в сети
Аватара пользователя

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу 1, 2, 3, 4, 5 ... 27  След.

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


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

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


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

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