Вход:  Пароль:  
FreeSource: AltLinux/Sisyphus/Alterator/objects ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |
Это старая версия AltLinux/Sisyphus/Alterator/objects за 2005-10-06 17:02:03..

Объектная система alterator.


В текущей нестабильной ветке alterator произошло большое изменение, там внедрены объекты. Зачем это нужно? Нужно это для того чтобы поддерживать код alterator было легче, чтобы убрать старые хаки, уменьшить количество cond и case, затрудняющее чтение. Что это такое? Читайте далее ....

Меченные функции


В Scheme, как во всяком уважающем себя функциональном языке, возможно построить структуру данных «пара» не пользуясь встроенными типами данных, а прямо на функциях. Например, это можно сделать так:

Однако всё не так хорошо как хотелось бы. Пользуясь только одними функциями невозможно сделать предикат pair?, то есть функцию, которая получив на вход некий объект, выдаёт истина только в случае если этот объект определённая выше структура «пара». Почему? Да очень просто. Вы не можете различать процедуры между собой. Ибо единственный способ различить подобные процедуры, это только запускать их, но результатом запуска может быть что угодно, включая попадание в вечный цикл. Говоря умнее, мы можем построить только полухарактеристическую функцию для множества пар.


Отсюда мораль, что требуется со стороны языка дополнительный способ «пометить» процедуры. Тогда мы могли бы гарантированно различать разные классы процедур между собой. Большинство реализаций Scheme поддерживают данный приём в том или ином виде.


Итак появляются первые две процедуры нашей объектной системы:


Пример:


Ура! Теперь мы можем различать между собой процедуры, чем это хорошо для нас – увидите чуть позже.

Объекты – это замыкания для бедных


Эта цитата принадлежит Norman Adams и сейчас вы убедитесь насколько это верно ;)


Любая созданная процедура, запоминает своё окружение, вместе со всеми определёнными там переменными и другими функциями. При этом запоминает настолько хорошо, что: куда бы далее вы не передавали эту процедуру, она будет работать именно с тем окружением в котором родилась (подобно тому как циплята, кого увидят первым, вылупившись из яйца, того и считают мамой), данные окружении будут существовать до тех пор, пока они требуются хотя бы одной процедуре. Например:



Здесь, функция +three, появившись запомнила, что x это 3, и при всех последующих запусках будет работать именно с этим значением, даже если мы явно зададим x в значение 10.


Итак, у нас есть «память», а если есть «память», значит можно сделать функции с состоянием, иначе говоря объекты.
Вот например простейший объект, изображающий точку на плоскости:


Вот теперь ясно видно, что имея замечательное свойство «памяти», можно создавать то что в других языках программирования называют объектами, то есть совокупность данных и методов, работающих с этими данными. То как именно строить объекты – никто вас не ограничивает, поэтому существует множество вариантов объектных систем для Scheme. Система объектов Alterator похожа на объектную систему T.

Методы или сообщения


Работают с объектами, как правило, одним из двумя способами: явно обращаясь в методам или данным или передавая объекту сообщение. Эти способы совершенно равноценны. Просто в одном языке удобнее вызвать метод:

В другом, послать объекту сообщение с желанием выполнить метод:

Как догадываетесь, в LISP принято использовать второй способ.

Простые объекты


На вводимые дальше объекты можно смотреть как на существенно улучшенные функции.
С одной стороны объект будет содержать в себе собственно тело функции, с другой стороны у него будет «вторая дверь» через которую можно будет вызывать определённые в объекте операции. То есть мы получаем объект «функция с рычагами».


Если захочется различать объекты между собой, то в конструирующей его процедуре, воспользуйтесь set-instance!.


Общий формат процедуры создания объектов следующий:

<proc> – выражение которое будет исполняться при каждом вызове объекта (дверь #1). <methods> – набор определённых операций (дверь #2). Операций может и не быть.
Вырожденный случай (есть только дверь #1):

Это тоже самое что и просто процедура:


Методы описываются в следующем формате:

Здесь:

Операции


Как же войти во вторую дверь? Для этого существуют так называемые операции.
Создаётся операция при помощи инструкции (operation имя)
Можно сразу создать и определить операцию (define-operation имя). Последняя конструкция полностью аналогична операции (define имя (operation имя))


Создадим объект точки на плоскости:

Составные объекты


Можно усложнять «маршрутизацию сообщений», тем самым создавая то, что в других языках программирования называют «наследованием» и «иерархией объектов».


Для комбинирования объектов используется процедура join. В результате применения join
объектам (object proc1 method11 method12 ...) (object proc2 method21 method22 ...)
Получится объект (object proc1 method11 method12 ... method21 method22 ... ).


Создадим объект точки в пространстве:


Все примеры выше не являются по сути вызываемыми объекты. Где же могут быть полезны настояшие дву-дверные функции-объекты.


Возьмём пример из самого alterator.


Создадим объект «пустой атрибут». Если у него спросить имя атрибута, то он его вернёт, а любые попытки вызова интерпретируются как пожелание задать данному атрибуту значение и в результате возвращается объект «аттрибут со значением». Последний также воспринимает сообщения на предмет получения его имени и значения, а все попытки вызова интерпретирует как пожлание добавить ещё одно значение, то есть в результате возвращается аттрибут с расширенным значением.
Пример:

Такое поведение очень удобно использовать в описании интерфейса


Описываются эти необычные объекты очень и очень просто:


Ну вот и всё. Объектная система простая – как и всё в Scheme.

Объекты в alterator


Какие же объекты применяются в самом alterator?


Ещё планируется введение объектов для нативных бакендов alterator, и объекта command но это дело будущего.


....



 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]