Forth
http://www.fforum.winglion.ru/

Quark: локальные объявления
http://www.fforum.winglion.ru/viewtopic.php?f=23&t=2942
Страница 1 из 4

Автор:  Hishnik [ Вс июн 16, 2013 02:55 ]
Заголовок сообщения:  Quark: локальные объявления

В новом билде кварка (build 32) в экспериментальных целях реализован новый механизм локальных объявлений. Механизм реализуется некоторой модификацией слов : ; и добавлением слов LOC[ ]LOC (обрамляющих область локальных объявлений). Дополнительно введен стек, названный пока за отсутствием мыслей о более точном термине стеком контекста компиляции. Как это работает: при начале определения нового слова состояние словаря CURRENT запоминается на вот этом самом стеке.
Слово LOC[ выполняет следующее:
- устанавливает ссылку вперед (запоминая адрес опять же на стеке контекста компиляции);
- переключает Форт в режим исполнения.
Слово ]LOC:
- разрешает ссылку вперед;
- устанавливает режим компиляции.
Слово ; дополнительно восстанавливает словарь CURRENT в состояние, забираемое со стека контекста компиляции.

Все. Если теперь работать с обычным определением, то пара : ; просто лишний раз забросит [CURRENT] на стек и снимет его оттуда. Никаких изменений в словаре при этом не происходит. Зато если внутри блока LOC[ ]LOC (напоминаю, внутри действует режим исполнения) определить дополнительные слова, то они добавляются в словарь (и вообще компилируются со всеми вытекающими последствиями), но слово ; ... исключит их из поиска, вернув состояние, в котором начиналась компиляция "объемлющего" слова! Иными словами, все, что определено в блоке LOC[ ]LOC, доступно только для слова, в котором этот блок определен, т.е. представляет собой локальные объекты.

Код:
VARIABLE X
1 X !

: TEST
  LOC[
    VARIABLE X
    : R 2 2 + . ;
  ]LOC

  5 X !
  X @ .
  R

;


TEST
X @ . 


Вывод этого кода: 5 4 1.

Особенностью (не пишу "недостатком") такого механизма является невозможность использования рекурсии: локальные переменные вовсе не создаются каждый раз при входе в слово. Просто для них выбираются фиксированные адреса, которые имелись в распоряжении компилятора в момент создания "объемлющего" определения. Там эти объекты и оказываются. Плюсом является возможность компиляции внутри слова чего угодно - обращаю внимание на наличие в примере локального определения R, которое при выходе оказывается недоступным (оно существует в словаре, но его Link не включен в цепочку поиска).

Build 32 пока не выложен, поскольку не все желаемое еще добавлено.

Автор:  gudleifr [ Вс июн 16, 2013 11:19 ]
Заголовок сообщения:  Re: Quark: локальные объявления

А мы-то, дураки, радовались, что в C все функции описываются на верхнем уровне, а не как в Pascal - вложенно...
Кстати, никогда не понимал, зачем придумывать имена локальным объектам, если Forth позволяет этого не делать...

Верните в Forth блоковую память и эти детские проблемы сами рассосутся...

Автор:  Hishnik [ Вс июн 16, 2013 12:58 ]
Заголовок сообщения:  Re: Quark: локальные объявления

Это, интересно, из какой доисторической эпохи вылезли соображения? :)

Автор:  gudleifr [ Вс июн 16, 2013 13:01 ]
Заголовок сообщения:  Re: Quark: локальные объявления

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

Автор:  mOleg [ Вс июн 16, 2013 16:37 ]
Заголовок сообщения:  Re: Quark: локальные объявления

контейнеры с данными внутри кода

Автор:  Hishnik [ Вс июн 16, 2013 16:47 ]
Заголовок сообщения:  Re: Quark: локальные объявления

mOleg писал(а):
контейнеры с данными внутри кода

Так это только данные. То есть надо что-то специальное придумывать и описывать. Получается, что работа с VARIABLE, FLOAT и VALUE должна быть реализована отдельно.

Автор:  gudleifr [ Вс июн 16, 2013 16:51 ]
Заголовок сообщения:  Re: Quark: локальные объявления

mOleg писал(а):
контейнеры с данными внутри кода
И чем это лучше CREATE-DOES?

Автор:  mOleg [ Вс июн 16, 2013 19:08 ]
Заголовок сообщения:  Re: Quark: локальные объявления

gudleifr писал(а):
И чем это лучше CREATE-DOES?

мы ведь не пользуемся CREATE DOES> вместо s" просто строка" ?!

Автор:  diver [ Вс июн 16, 2013 19:14 ]
Заголовок сообщения:  Re: Quark: локальные объявления

хм... интересненько, однако!

а что-ндь типа Муровского мультивхождения в слово не планируется? или может уже есть?

пример:
Код:
: слово1 действия1 : слово2 действия2 : слово3 действия3 ;

Код:
: sub invert 1+ : add + ;

Автор:  gudleifr [ Вс июн 16, 2013 19:35 ]
Заголовок сообщения:  Re: Quark: локальные объявления

mOleg писал(а):
мы ведь не пользуемся CREATE DOES> вместо s" просто строка" ?!
И вместо IF и ELSE тоже. Странно, да?
Другими словами, вы не видите преимуществ "контейнеров" по сравнению с CREATE-DOES?

Автор:  gudleifr [ Вс июн 16, 2013 19:39 ]
Заголовок сообщения:  Re: Quark: локальные объявления

diver писал(а):
мультивхождения
От подобных излишеств и умер FORTRAN-77.

Автор:  diver [ Вс июн 16, 2013 19:41 ]
Заголовок сообщения:  Re: Quark: локальные объявления

вся прелесть Форта в многообразии описания различных требуемых конструкций и типов данных, а также в легкости создания подобных описаний средствами языка. РАЗЛИЧНЫМИ средствами языка. в том числе и созданными самим разработчиком.

Автор:  Hishnik [ Вс июн 16, 2013 19:43 ]
Заголовок сообщения:  Re: Quark: локальные объявления

diver писал(а):
а что-ндь типа Муровского мультивхождения в слово не планируется? или может уже есть?

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

Автор:  gudleifr [ Вс июн 16, 2013 19:49 ]
Заголовок сообщения:  Re: Quark: локальные объявления

diver писал(а):
в том числе и созданными самим разработчиком.
"в том числе" выкинуть и будет правда:
1. В Forth есть все необходимое для подобных изысков.
2. Разработчик при необходимости может создать все сам.
Следовательно.
3. Заранее закладывать подобные фичи смысла нет.

P.S. Было бы полезно описать методы решения подобных задач на неком мета-Forth...
Например, задача "мультивхождений" делается элементарно и, самое главное, полезно только при раздельном хранении заголовков и кода. В других случаях приходится идти на ухищрения: резервирование доп.входов заранее, лишние прыжки или отложенная компиляция...

Автор:  mOleg [ Вс июн 16, 2013 19:56 ]
Заголовок сообщения:  Re: Quark: локальные объявления

gudleifr писал(а):
И вместо IF и ELSE тоже. Странно, да?

да пожалуйста!

gudleifr писал(а):
Другими словами, вы не видите преимуществ "контейнеров" по сравнению с CREATE-DOES?

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

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