Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн июл 23, 2018 00:22

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 55 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 02:55 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6344
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
В новом билде кварка (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 пока не выложен, поскольку не все желаемое еще добавлено.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 11:19 
А мы-то, дураки, радовались, что в C все функции описываются на верхнем уровне, а не как в Pascal - вложенно...
Кстати, никогда не понимал, зачем придумывать имена локальным объектам, если Forth позволяет этого не делать...

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 12:58 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6344
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
Это, интересно, из какой доисторической эпохи вылезли соображения? :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 13:01 
Хищник писал(а):
из какой доисторической эпохи вылезли соображения?
Из тех допотопных времен, когда программисты писали то, что было кому-то надо, а не то, что легко написать.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 16:37 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
контейнеры с данными внутри кода

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6344
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
mOleg писал(а):
контейнеры с данными внутри кода

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 16:51 
mOleg писал(а):
контейнеры с данными внутри кода
И чем это лучше CREATE-DOES?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:08 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
gudleifr писал(а):
И чем это лучше CREATE-DOES?

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:14 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 585
Благодарил (а): 6 раз.
Поблагодарили: 25 раз.
хм... интересненько, однако!

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:35 
mOleg писал(а):
мы ведь не пользуемся CREATE DOES> вместо s" просто строка" ?!
И вместо IF и ELSE тоже. Странно, да?
Другими словами, вы не видите преимуществ "контейнеров" по сравнению с CREATE-DOES?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:39 
diver писал(а):
мультивхождения
От подобных излишеств и умер FORTRAN-77.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:41 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 585
Благодарил (а): 6 раз.
Поблагодарили: 25 раз.
вся прелесть Форта в многообразии описания различных требуемых конструкций и типов данных, а также в легкости создания подобных описаний средствами языка. РАЗЛИЧНЫМИ средствами языка. в том числе и созданными самим разработчиком.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:43 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6344
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
diver писал(а):
а что-ндь типа Муровского мультивхождения в слово не планируется? или может уже есть?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:49 
diver писал(а):
в том числе и созданными самим разработчиком.
"в том числе" выкинуть и будет правда:
1. В Forth есть все необходимое для подобных изысков.
2. Разработчик при необходимости может создать все сам.
Следовательно.
3. Заранее закладывать подобные фичи смысла нет.

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: локальные объявления
СообщениеДобавлено: Вс июн 16, 2013 19:56 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
gudleifr писал(а):
И вместо IF и ELSE тоже. Странно, да?

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

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

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

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


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

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


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

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


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

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