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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу Пред.  1 ... 16, 17, 18, 19, 20, 21, 22 ... 27  След.
Автор Сообщение
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Ср апр 18, 2012 10:23 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
spf писал(а):
Если получается ( 81 25 ), то это похоже на замыкание! ;)

Насколько я понял это не замыкание.
spf писал(а):
Наверное, память при этом утекает?

Память не утекает.
spf писал(а):
Где ваша библиотека?

В разделе Программирование в теме Локальные слова.
Правда сейчас она несколько другая, но это не принципиально.
PS. Не знаю что такое лямбда да и многое другое, да и особо знать не хочу, потому, что если что-то понадобится
всегда можно сделать на форте(форт так задуман, нужны лишь знания о среде в которой работает форт-система и о самом устройстве форт-системы).
A то, что идет в виде LAMBDA{ ... } выдает на стек xt выражения в скобках и все.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Ср апр 18, 2012 18:13 
chess писал(а):
spf писал(а):
Если получается ( 81 25 ), то это похоже на замыкание! ;)

Насколько я понял это не замыкание.

Испытываю в spf4al.exe с последним вариантом lvoc.f
Код:
: s ( a b -- xt)  b! a! LAMBDA{ a b + DUP * } ;

2 3 s  4 5 s  EXECUTE SWAP EXECUTE  \ ( 81 81 )

Да, нет здесь замыкания. Как у вас получалось ( 81 25 ) — непонятно.


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

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

Все верно. Это я 'с`апроксимировал' и ошибся.

Чтобы эти замыкания делать надо при каждом исполнении слова создавать новые экземляры вложенных процедур и переменных.

Ну проверить то это легко:

Код:
0 VALUE cnt
: s \ n1 n2 -- (n1+n2)**2
cnt IF   a! b! x( a b + DUP * x)
    ELSE c! d! x( c d + DUP * x) THEN
cnt 1+ TO cnt
;
2 3 s 4 5 s EXECUTE SWAP EXECUTE ( 81 25 )


Теперь нужно упростить синтаксис, чтобы это выглядело как раньше.
В качестве одного из путей решения можно использовать генерацию кода внутренних процедур и внешних по отношению к ним переменных в хип.
Память потечет.
Вот только когда это будет нужно?
Пока мне такое не было нужно.

Кстати вот пример реализации замыкания
Код:
\ компиляция строки
: evals ( addr u -- ) TRUE STATE ! EVALUATE RET, FALSE STATE ! ;

\ компиляция строки в хип
: xts ( a u -- xt ) u! a! 256 ALLOCATE THROW b! DP @ h! b DP ! a u evals h DP ! b ; \ пока без анализа длины кода - как пример

: func S" LITERAL LITERAL 0/'1!'2!12+d* " xts ;

2 3 func 4 5 func EXECUTE SWAP EXECUTE
( 81 25 )

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


Последний раз редактировалось chess Вс апр 21, 2013 21:47, всего редактировалось 1 раз.

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

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

Код:
\ Lambda. код внутри конструкции L{  } не выполняется, возвращается xt на этот код.   
: L{  ( -- ) LAST-NON HERE BRANCH, >MARK 2 HERE DUP TO LAST-NON ; IMMEDIATE
: }   ( -- xt )  >R POSTPONE EXIT POSTPONE THEN R> POSTPONE LITERAL TO LAST-NON ; IMMEDIATE

: >> 0123456789_ 2345678901i ;
: << 0123456789_ 8901234567i ;

: s 12i L{ 12+d*_ } ;
: z 2 3 s >> 4 5 s EXECUTE SWAP << EXECUTE ;

z {enter}
Ok ( 81 25 )


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб апр 21, 2012 03:36 
chess писал(а):
Это я 'с`апроксимировал' и ошибся.

Именно поэтому (повторяя себя), —
Цитата:
spf писал(а):
такие ограничения необходимо документировать и аккуратно с ними обходится при использовании.


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


Когда будет нужно, тогда и сделать тот или иной вариант ;)

А пока — да, есть ограничения, связанные с реентерабельностью и побочными эффектами. Но, это не критично — с ними можно жить, если правильно их готовить.


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

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

Согласен.

Хочу привести еще несколько соображений по развитию манипуляторов.
1. Для того, чтобы завести новый буфер стека в заголовке манипулятора сейчас использую символ '/'.
Например по n/ (n от нуля до F ) заводится новый буфер фиксированного объема( у меня сейчас это 64 байта - 16 ячеек) для стека.
Можно устанавливать в любом месте определения, но это должен быть первый манипулятор в определении(для реентерабельности). Следующие манипуляторы будут уже обычного вида n\(при этом используется буфер, заведенный по n/).
При этом ячейки этого буфера доступны в любом манипуляторе этого определения.
Доступ к ячейкам выше 9-й через `A, `B, .... `F.
Кстати часть этого буфера можно использовать в самом манипуляторе по другому назначению, например:
Код:
\ консольный ввод четырех байтного числа
: inp4 ( -- n)  0/`0d'1d`5A#xxx ; ( A это ACCEPT, # это >NUMBER )
чтобы было понятно, тоже самое на обычном Форте:
Код:
: inp4 ( -- n) 0. buf DUP 5 ACCEPT >NUMBER 2DROP DROP ; \ buf - это адрес буфера для ACCEPT, а 5 - это число байтов в buf
Если буфер для потребностей манипулятора нужен большой можно брать размер буфера со стека, а для манипулятора создающего буфер стека и одновременно буфер для функционала манипулятора использовать синтаксис, например, такой: b/,
тогда 1000 b/ будет означать, что вместо 64-байтного буфера будет создан 1000-байтный, при этом остальные манипуляторы будут использовать начало этого буфера.
2. Для использования большей кодовой базы(набора слов) можно через префикс ' перед символом слов указывать, что слово
задается не одним символом а двумя, а через префикс " - тремя. Как делать разбор таких составных символов это уже дело вкуса.
Можно наделать несколько тематических таблиц символов(файлы, окна, графика и тд) и начинать составной символ с символа темы, например 'fo - OPEN-FILE, 'fc - CLOSE-FILE, 'wc CREATE-WINDOW и тд. Таблицы могут быть и вложенными(дерево, а не список).
Плюс такого именования - не создается контекст, а иерархия функционала поддерживается.

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


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
1. я в последней реализации остановился на таком решении -
отвел статически 10 буферов(кадров) по 10 ячеек. Слово __ которое надо использовать
для реентерабельных целей существенно упростилось - просто переустанавливает
указатель [d] и готовит возврат к предыдущему буферу(кадру) при выходе из слова
с манипулятором (такой простейший стек).
Код:
USER-CREATE [d0] 10 10 * CELLS USER-ALLOT USER [d] [d0] [d] !
: (smRET) -10 CELLS [d] +! ;  : __   10 CELLS [d] +! R> ['] (smRET) >R >R ;

естественно легко можно сделать слова аналоги префикса 0/...9/ - непосредственно установка
рабочего буфера(кадра):
Код:
: 0d! ( 0/ ) [d0]            [d] ! ;   : 5d! ( 5/ ) [d0] 50 CELLS + [d] ! ;
: 1d! ( 1/ ) [d0] 10 CELLS + [d] ! ;   : 6d! ( 6/ ) [d0] 60 CELLS + [d] ! ;
: 2d! ( 2/ ) [d0] 20 CELLS + [d] ! ;   : 7d! ( 7/ ) [d0] 70 CELLS + [d] ! ;
: 3d! ( 3/ ) [d0] 30 CELLS + [d] ! ;   : 8d! ( 8/ ) [d0] 80 CELLS + [d] ! ;
: 4d! ( 4/ ) [d0] 40 CELLS + [d] ! ;   : 9d! ( 9/ ) [d0] 90 CELLS + [d] ! ;

Цитата:
2. Для использования большей кодовой базы(набора слов) можно через префикс ' перед символом слов указывать, что слово
задается не одним символом а двумя, а через префикс " - тремя.

можно и так, хорошо что не надо забегать вперед на неизвестное количество символов
как в случае со словами в квадратных скобках [fo], а с другой стороны слова ' и "
экономят в записи манипулятора всего лишь один символ. Хотя конечно они выглядят
более "поточно" но и более непрывычно. Развитие манипуляторов похоже на
построение иероглифов - из более простых комбинировать сложные.

Хотя мне на сегодняшний день больше нравится "рыхлый" и "размазанный" манипулятор
состоящий из мелких блоков разделенных пробелами и другими форт-словами.
Код:
sx  ( n1 n2 n3 n4 n5 -- n5 n1+n2+n3 n4 )
: sum + + ;
: s1 5\5123[sum]4 ;     \ 12 символов
: s2 5\5123"sum4 ;      \ 11 символов
: s3 5\ 5123_ sum 4_ ;  \ 15 символов
: s4 5\ 5123"sum4_ ;    \ 13 символов, если включить слова ' и " в компилятор m-блока


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

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

Нет это не то.
Есть стандартный набор слов(допустим АНСИ94)
Вот их-то и нужно 'загнать' в манипуляторы путем сокращения их имен, а имена
там как правило длинные.
Форт многословен, точнее многоименен.
Манипуляторы эквивалентны словам, но не имеют имен.
Возможность сочетания того и другого дает более оптимальные решения.
Иероглифы это просто знаки со значением(отвечают на вопрос что). Манипуляторы это зафиксированные микроалгоритмы(последовательности действий, отвечают на вопрос как).

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Начал осваивать github
Для начала выложил туда часть моих расширений SPF4 https://github.com/chess2007/spf-ext
Первая неприятность - не поддерживает кодировку win-1251. :(

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Пт апр 27, 2012 17:40 
chess писал(а):
Начал осваивать github
Для начала выложил туда часть моих расширений SPF4 https://github.com/chess2007/spf-ext

Здорово :)

chess писал(а):
Первая неприятность - не поддерживает кодировку win-1251. :(

Это да.. Очень трудно поддерживать национальные кодировки на международном ресурсе. Выход один — Unicode. Используйте UTF-8 в исходниках, это оправдано.

Там есть еще проблема неверного распознования языка (и, как следствие, левая подсветка синтаксиса), — т.к. Форт еще не добавлен. Но, это проблема вполне решаема.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
chess писал(а):
github
Цитата:
We recommend adding a README to this repository. Visit github/markup for details on what formats we support.


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

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
spf писал(а):
Это да.. Очень трудно поддерживать национальные кодировки на международном ресурсе. Выход один — Unicode. Используйте UTF-8 в исходниках, это оправдано.

Там есть еще проблема неверного распознования языка (и, как следствие, левая подсветка синтаксиса), — т.к. Форт еще не добавлен. Но, это проблема вполне решаема.


Использовал видимо недокументированную возможность github(читай - недоработку авторов): :o
Свои файлы на компе как и раньше пишу в win-1251. Потом сбрасываю их на github. На странице github устанавливаю кодировку
utf-8. И файлы отображаются там как в win-1251. Хитрость в том, что текст файла должен начинаться с латиницы, а затем
уже могут идти комментарии на кирилице. А так как я не планирую их редактировать на github, то это меня устраивает.
Еще, чтобы github не привязывал к текстам подсветку для какого-либо github-поддерживаемого языка я сменил расширение для файлов на нестандартное(конкретно у меня это - spf). Подсветку я давно никакую не люблю.

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Alex писал(а):
подправил таблицу операций, добавил префиксы ' и " внутри манипулятора и м-блока,
инициализацию 0/..9/. chess как Вы планируете использовать ресурс на гитхабе
как персональный или ориентировать на стековые манипуляторы? Если последнее то может
быть имеет смысл разместить там и мой альтернативный вариант?

Да почему нельзя. Можно.
С ресурсом на гитхабе я еще немного поэкспериментирую. А так что для вас нужно, чтобы начать выкладывать туда?
Самое простое это знать адрес на гитхабе и имя и пароль для доступа. Ну это я вам дам(лучше через ваш email), а дальше
я еще толком не знаю(или форк делайте, или свой каталог - короче, копию вашего репозитория на вашем компе).
Насчет самих манипуляторов - по сути это определенные синтаксисические конструкции, построенные по небольшому количеству однозначных правил, которые описывают взаимодействие между двумя
структурами данных, стеком параметров и буфером. Со стека в буфер, из буфера в стек. Можно еще из буфера в буфер.
Тут надо еще подумать.
В форте имена слов это иероглифы(по сути те же символы, образованные комбинацией букв и знаков, при этом смысл в них вкладывает программист когда описывает их в коде). Какое-то количество таких иероглифов можно держать в памяти. Но при большом объеме быстро создаваемой программы большое количество иероглифов начинает давить. Поэтому число глобальных имен должно быть уменьшено до минимального количества. Тут в помощь как раз синтаксис(манипуляторы и тп), локальные имена(словари) и тп. Правда если программа только одна и делается долго, то создание лексиконов(набора глобальных имен) прокатывает

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


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Цитата:
Самое простое это знать адрес на гитхабе и имя и пароль для доступа. Ну это я вам дам(лучше через ваш email), а дальше
я еще толком не знаю(или форк делайте, или свой каталог - короче, копию вашего репозитория на вашем компе).

думаю лучше свой каталог, немного про гитхаб почитаю и отпишу на почту.

Тут у нас колизия получается, есть в форт-системе слова из двух символов,
начинающихся на цифру: 0! 0= 0< 2* 2/ 2- 2+ 1- 1+ 2! 2@ и
поэтому их не получится ввести с помощью символа ' так как сработает другое
правило если после символа ' идет цифра вернуть адрес сотв. ячейки манипулятора.
тут можно слова-синонимы ввести или использовать [ и ],

или вот такой интересный вариант:
пусть адрес ячейки манипулятора возвращает обратный апостров ` (сейчас он
дает непосредственно константу 1..9) а слово ' всегда выбирает два символа
и ворачивает либо константу, либо компилирует двухбуквенное слово. например
0\'01'64'-4 - положить на стек константу 1, число 64 и число -4
0\'2@'0!'2+ - скомпилировать соответствующие форт-словва
ну и для " разрешить работу с чмслами: 0\"128"-64 на стек чмсла 128 и -64


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

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


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

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


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

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