Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 07:03

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25, 26, 27  След.
Автор Сообщение
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт дек 28, 2012 23:12 
true-grue писал(а):
ArtemKAD писал(а):
Как по мне конкретно этот пример не слишком понятнее чем


Вот то-то и оно. Вкусовщина. В Форте ведь вообще много странностей, с точки зрения популярных ЯП. Давайте все "исправим". Или могу подсказать Вам несколько языков, где "локалсы" очень органично смотрятся, а не являют собой "костыль", как в Форте.

На что исправим? На еще одну странность? А смысл менять?
true-grue писал(а):
Вон, в Forth 200x придумывают очередной вариант locals. Антон Эртл в одной из статей о локальных переменных отзывается, как о перегруженных ограничениями и одном из слабейших элементов текущего стандарта. Не говоря уже о том, что 99% фортеров, включая автора языка, вообще полностью обходят стороной эту, чужеродную вычислительной модели Форта, конструкцию.

Берем SPF, открываем папку devel и делаем в ней поиск по слову locals ... Результат 231 файл. Причем и Черезов и Немцов (создатели наиболее известных продуктов) ими активно пользуются... Да и у остальных почти всех локалсы так или иначе проскакивают.

true-grue писал(а):
Кстати, если Вы из тех, кто в любой форумной дискуссии пытается любой ценой оставить за собой последнее слово, то я легко предоставлю такую возможность.

Об этом можете даже не беспокоиться. Если я задаю вопросы, то естественно жду на них ответы, а не желаю их сделать последним словом :? ...
true-grue писал(а):
ArtemKAD писал(а):
формальное правило заставило описывать, что с первым и вторым элементом ничего не произошло...

Вот это уже по существу! На этот случай нотацию можно доработать примерно в таком духе. Если уж очень хочется.
Код:
: count> ( x array - x count)
   0 swap each: { x count element - .. x} > if 1 + then ;

И что поменялось? Ввели еще одно правило не убрав суть.

ЗЗЫ. Кстати, еще 6 лет назад у chess была такая мысль
chess писал(а):
Предлагаю ввести дополнительные синтаксические конструкции для работы с параметрами на стеке параметров.

s11 эквивалент DUP
s21 эквивалент SWAP
s231 эквивалент ROT
s312 эквивалент -ROT
s121 эквивалент OVER
s1212 - 2DUP
s2 - NIP
s212 - SWAP NIP
s112 - TUCK
Исходно перед операцией со стеком, требующей манипуляции с n параметрами на вершине стека лежит параметр обозначаемый в слове s1..n номером n.
Программист без заморочек пишет нужное выражение, например s2132. При этом понимается, что стек параметров
изначально имел вид 123, а в конечном итоге будет иметь вид 2132.

Ваш пример манипуляции выглядел бы так:
s1231

Хотя для полноты там не хватает указания со сколькими элементами исходного стека мы работаем (если убрать самый верхний(или глубокий - откуда будем считать) элемент).


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 00:31 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Я бы попользовался перестановщиком в стиле ( a b c d -- a b d c a c d )


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 00:48 
Хищник писал(а):
Я бы попользовался перестановщиком в стиле ( a b c d -- a b d c a c d )

Возможно.
Но тут два момента:

1) Исходное состояние стека - всегда "a b c d e f" и эта запись нужна только для определения числа элементов с которыми работаем и для объявления имен. Если имена фиксированы, буква латиницы или цифра, цифра удобнее т.к. для буквы еще надо вспомнить которая она по счету, а нас интересует именно номер элемента стека.
2) Представь что DUP SWAP DROP ROT вообще нет. Чем предпочтешь их заменить ( a b c d -- a b d c a c d ) или "говорящими названиями" типа S4:1243134 ?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 01:02 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
ArtemKAD писал(а):
2) Представь что DUP SWAP DROP ROT вообще нет. Чем предпочтешь их заменить ( a b c d -- a b d c a c d ) или "говорящими названиями" типа S4:1243134 ?

Конечно первый вариант. Лично мне вообще фиолетово в каком порядке элементы на стеке — мне важнее то, какой смысл они несут, с чем ассоциированы.
addr — сразу понятно, что это адрес, а не элемент под номер XXX. И вообще, вот мне как-то уже надоело читать весь этот флуд про стековые манипуляторы. Надо тоже немного пошуметь.
Считаю, что некоторые товарищи слишком увлеклись самой идеей автоматических стековых перестановок и напихали туда дикое количество совсем не тех вещей. А какая была задача-то? Как? Уже и забыли? Вроде как хотели упростить операции со стеком. А к чему пришли в итоге? Опять к локальным переменным. Я когда первый раз увидел идею про стековые манипуляторы — первая идея была "вот еще бы им синтаксис как у локальных переменных". Ну вот, теперь пишем локальные переменные, они конвертируются в стековый манипулятор, который затем вертит параметрами на стеке. Отлично, теперь выкинуть кучу лишнего и может даже получится что-то интересное.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
ArtemKAD писал(а):
1) Исходное состояние стека - всегда "a b c d e f" и эта запись нужна только для определения числа элементов с которыми работаем и для объявления имен. Если имена фиксированы, буква латиницы или цифра, цифра удобнее т.к. для буквы еще надо вспомнить которая она по счету, а нас интересует именно номер элемента стека.

Тогда можно и так:
( 4 -- a d c b a ), где 4 - число снимаемых со стека элементов перед их переупаковкой.
ArtemKAD писал(а):
2) Представь что DUP SWAP DROP ROT вообще нет. Чем предпочтешь их заменить ( a b c d -- a b d c a c d ) или "говорящими названиями" типа S4:1243134 ?

Разумеется, ( a b c d -- a b d c a c d )! :) Почему вон та непонятная мешанина символов - "говорящее название"???


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
да они обе - мешанины, просто, к стековой нотации фортеры уже привыкли...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 02:13 
Хищник писал(а):
ArtemKAD писал(а):
1) Исходное состояние стека - всегда "a b c d e f" и эта запись нужна только для определения числа элементов с которыми работаем и для объявления имен. Если имена фиксированы, буква латиницы или цифра, цифра удобнее т.к. для буквы еще надо вспомнить которая она по счету, а нас интересует именно номер элемента стека.

Тогда можно и так:
( 4 -- a d c b a ), где 4 - число снимаемых со стека элементов перед их переупаковкой.

Но разве так ( 4 -- 1 4 3 2 1 ) было-бы не наглядней? А то у меня мало того, что d и b в глазах путаются, так еще и номер буквы не всегда сразу ассоциируется.

Хищник писал(а):
ArtemKAD писал(а):
2) Представь что DUP SWAP DROP ROT вообще нет. Чем предпочтешь их заменить ( a b c d -- a b d c a c d ) или "говорящими названиями" типа S4:1243134 ?

Разумеется, ( a b c d -- a b d c a c d )! :) Почему вон та непонятная мешанина символов - "говорящее название"???

Согласись, что названия слов OVER ROT NIP о том, что слова делают со стеком говорят многократно меньше чем слово s2:121. Те просто надо зазубрить, а тут надо выучить только правила построения, а слово уже "само за себя скажет".

ЗЫ. Кстати, попробуй дать название слову которое делает перестановку как "вон та непонятная мешанина символов" ;) ?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 09:17 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Еще немного упрощения ( выкинул манипуляции входным потоком.)
добавлено новое слово .. аналог - , за тем исключением что не трогается стек.
теперь конструкция может занимать несколько строк, надо ли увеличить количество слов?

Код:
S" sm.f" INCLUDED

CREATE buf 160 ALLOT  VARIABLE wrd   VARIABLE sym 

: sym+ ( char -- ) buf C@ 1+ DUP buf C! buf + C! ;
: wrd! ( a u -- ) wrd @ 1+ wrd ! buf wrd @ 16 * + 2DUP C! 1+ SWAP CMOVE ;
: fnd! ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I 16 * buf + DUP C@ 1 0 D+ COMPARE 0= IF I 48 + sym+ LEAVE THEN LOOP 2DROP ;
: 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 160 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

: test1 1 2 3 4 { a b c d - a b d c a c d } DEPTH .SN CR CR ;
\ результат test1 ( 1 2 4 3 1 3 4 )

: test2 1 2 3  { x count element .. x } DEPTH .SN CR CR  ;
\ результат test2 ( 1 2 3 1 )

: test3 1 2 3  { x count element - x } DEPTH .SN CR CR  ;
\ результат test3 ( 1 )

: test4
1 2 3 
{
x count element - 

}
DEPTH .SN CR CR  ;

\ результат test4 ( 1 )


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
И еще вопросик, а надо ли делать поддержку операций ?
Код:
: test5 1 2 3  { x count element - x element + } DEPTH .SN CR CR  ;
\ результат test5 ( 4 )

это займет обьем , но делается довольно просто


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

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
ArtemKAD писал(а):
Причем и Черезов и Немцов (создатели наиболее известных продуктов) ими активно пользуются... Да и у остальных почти всех локалсы так или иначе проскакивают.

Мнение Черезова я знаю, общался с ним на тему реализации локальных переменных в форт-процессоре. Но Ваша точка зрения, не признавать _ничего_, кроме locals, мне непонятна. Чем моя конструкция помешает лично Вам?

ArtemKAD писал(а):
И что поменялось? Ввели еще одно правило не убрав суть.

Суть (читаемый код) и должна сохраняться. Моя конструкция понуждает разработчика документировать код и это ее свойство я считаю ключевым.


ArtemKAD писал(а):
ЗЗЫ. Кстати, еще 6 лет назад у chess была такая мысль

Снова Вы отстали от дискуссии. Я не помню точной хронологии изобретений г-на chess'а, но он уже давно пришел к варианту "3\1231".

Alex писал(а):
Еще немного упрощения ( выкинул манипуляции входным потоком.)
добавлено новое слово .. аналог - , за тем исключением что не трогается стек.


Отлично! Мне кажется, вариант S" -.." COMPARE был бы симпатичнее. Но, вообще говоря, я предполагал несколько иное использование "..": замена каждого вхождения этого слова на содержимое стека слева. То есть.

Код:
: 2dup { a b - .. .. } ;
: tuck { x1 x2 - x2 .. } ;


Alex писал(а):
И еще вопросик, а надо ли делать поддержку операций ?

А вот это лишнее, на мой взгляд. Вообще, от низкого уровня (стековые операции, генератор стековых перестановок) лучше переходить не к среднему (манипуляторы, locals), а сразу к высокому, проблемно-ориентированному. То есть к созданию edsl (встроенный dsl). Средствами создания подобных edsl (в первую очередь, анализаторов рекурсивного спуска) следует отдельно озаботиться. В качестве примера можно привести язык Rebol (автор которого вдохновлялся Фортом) и ключевое слово parse, с диалектами на его основе. Но это тема отдельная.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
ArtemKAD писал(а):
Но разве так ( 4 -- 1 4 3 2 1 ) было-бы не наглядней? А то у меня мало того, что d и b в глазах путаются, так еще и номер буквы не всегда сразу ассоциируется.

Нет, потому что можно ведь написать ( 4 -- a b 2 3 c ), где 2 и 3 положат на стек числа.
ArtemKAD писал(а):
Согласись, что названия слов OVER ROT NIP о том, что слова делают со стеком говорят многократно меньше чем слово s2:121. Те просто надо зазубрить, а тут надо выучить только правила построения, а слово уже "само за себя скажет".

Эти слова в английском варианте как раз и говорят о выполняемом действии. Зазубривание этих слов обычно происходит на самых ранних этапах освоения Форта, когда особых предпочтений еще нет. А вот потом нет особой надобности менять шило на мыло.
ArtemKAD писал(а):
ЗЫ. Кстати, попробуй дать название слову которое делает перестановку как "вон та непонятная мешанина символов" ?

А что тут пробовать-то? :) PREPARE-ARGUMENTS-FOR-MY-WORD.


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
версия где в левой части до 9 слов, а правая часть может содержать до 62 слов
Код:
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 ;
: 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 2DROP ;
: 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

еще сделал версию где можно использовать весь запас манипуляторов, к примеру так:
Код:
: test6 1 2 3 4 5  { x1 x2 x3 x4 x5  - x3 1 > IF x1 x2 x4 x5 D+ ELSE x1 x1 x2 x2 D+ THEN } DEPTH .SN CR CR  ;
\ результат test6 ( 5 7 )

но боюсь, что шокирую публику :) и есть еще один побочный эффект, не знакомые слова игнорируются:
Код:
: test5 1 2 3  { x count element - x некторый_произвольный_текст element как коментарий } DEPTH .SN CR CR  ;
\ результат test5 ( 1 3 )


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
PREPARE-ARGUMENTS-FOR-MY-WORD.

PAFMW или ПИФ-ПАФ-ОЙ-ОЙ-ОЙ :)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 15:20 
Хищник писал(а):
ArtemKAD писал(а):
Но разве так ( 4 -- 1 4 3 2 1 ) было-бы не наглядней? А то у меня мало того, что d и b в глазах путаются, так еще и номер буквы не всегда сразу ассоциируется.

Нет, потому что можно ведь написать ( 4 -- a b 2 3 c ), где 2 и 3 положат на стек числа.

А это надо? Насколько помню ни одна из команд манипулирующих стеком не добавляет туда числа. Ведь там где число, там должно быть и слово. А тогда что прикажете делать если слова a b c уже существуют - a b c это тогда манипуляция стеком или вызов уже существующего слова??? Может не стоит превращать хорошую (и главное - простую) идею снова в монстра как это получилось у chess ?

Хищник писал(а):
ArtemKAD писал(а):
Согласись, что названия слов OVER ROT NIP о том, что слова делают со стеком говорят многократно меньше чем слово s2:121. Те просто надо зазубрить, а тут надо выучить только правила построения, а слово уже "само за себя скажет".

Эти слова в английском варианте как раз и говорят о выполняемом действии.

И в английском не говорят. Говорящие только DUP DROP и SWAP (за что ИМХО и используются больше остальных). Остальные более чем спорны.

Хищник писал(а):
ArtemKAD писал(а):
ЗЫ. Кстати, попробуй дать название слову которое делает перестановку как "вон та непонятная мешанина символов" ?

А что тут пробовать-то? :) PREPARE-ARGUMENTS-FOR-MY-WORD.

Для следующей подобной, но не такой перестановки будет это-же слово или придумаете другое ;) ?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 15:28 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
я пока вот вижу одно полезное применение подобного механизма, если он позволит легко описывать базовые операции (примитивы) для вновь создаваемой форт-системы. Это было бы очень полезно, не залазя в дебри опкодов процессора описывать базовые понятия.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25, 26, 27  След.

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


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

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


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

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