Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Вычисление форм catch и throw

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

Формы синтаксически записываются следующим образом:

(catch выражение-метки выражение1 выражение2 …)

(throw выражение-метки віражение)

Результатом вычисления формы catch является последнее вычисленное выражение, если в качестве одного из выражений не вычислялась форма throw. Если же вычислялась указанная форма, то нормальный ход вычислений формы catch прерывается и результат вычисления выражения формы throw определяет результат вычисления той обрамляющей формы catch, которая имеет ту же метку, что и форма throw.

Пример

>(setq k 2)

2

>(setq z ‘m1)

m1

>(catch ‘m1 (setq x 3)(+ 5 6 x)

(catch ‘m2 (setq y 1)

(if (> k x) (throw ‘m2 y)

(throw z x))

)

)

3

>

Объектное программирование в Xlisp Создание класса

В Xlisp сообщение объекту посылается вычислением выражения следующего вида:

(send объект-адресат :селектор-сообщения e1 e2 …),

где e1 e2 … - выражения аргументов.

Класс создается посылкой сообщения :isnew к классу class. Имя класса в сообщении не указывается и поэтому созданный объект, представляющий класс, будет удален сборщиком мусора, если его не привязать к некоторой переменной. В сообщении :isnew указываются:

  • список переменных объекта класса (экземпляра),

  • список переменных класса и

  • суперкласс (по умолчанию это класс object).

Результатом вычисления сообщения :isnew является объект, представляющий класс.

Пусть требуется создать класс объектов, представляющих словари. Каждый экземпляр этого класса должен хранить некоторые имена-ключи и сопоставляемые им значения. Необходимо, также, обеспечить добавление новых элементов в словари и поиск элементов по ключам.

Для создания класса словарей выполним следующее:

>(setq dictionary (send class :isnew ‘(entries)))

#<object: #485742a8>

Переменные экземпляра представлены единственной переменной entries. Интерпретатор Лиспа выводит стандартное внешнее представление класса, содержащее адрес его размещения. Значением переменной dictionary является объект, представляющий новый созданный класс.

Добавление методов в интерактивном режиме

Когда создается экземпляр посылкой сообщения с селектором :new к классу, Интерпретатор Лиспа формирует сообщение с селектором :isnew к экземпляру с аргументами, которые являются точной копией аргументов из сообщения :new. Поэтому в первую очередь необходимо определить реакцию экземпляра на сообщение :isnew. Для создания новых методов в классе, необходимо к нему послать стандартное сообщение с селектором :answer, аргументами которого являются:

  • селектор нового метода,

  • список параметров, представленный лямбда-списком, и

  • тело метода.

>(send dictionary :answer :isnew ‘() ; селектор и параметры

‘((setq entries nil) ; тело метода

self)

#<object: #485742a8>

В теле метода вначале устанавливается для переменной entries значение nil. Второе выражение представлено self, что означает, что результатом вычисления метода с селектором :isnew является сам объект, которому посылается сообщение. Тело метода обычно представляют списком выражений и такой список не должен вычисляться. Для этого используется quote-выражение (апостроф).

Определим в классе метод с селектором :add, который обеспечит добавление элементов в словарь. В качестве аргументов должны указываться ключ и значение:

>(send dictionary :answer :add ‘(name value) ; селектор и параметры

‘((setq entries

(cons (cons name value) entries))

value)

#<object: #485742a8>

Метод, соответствующий селектору :add, в качестве результата возвращает значение второго параметра. Пара ключ-значение добавляется к списку entries.

Теперь можно создать экземпляр словаря и внести в словарь несколько элементов:

>(setq d (send dictionary :new)) ; создание словаря

#<object: #4857013a>

>(send d :add ‘winston ‘computer-scientist) ; внесение элементов в словарь

‘computer-scientist

>(send d :add ‘mozart ‘composer) ; внесение еще элементов в словарь

composer

Добавим к классу метод для поиска элементов в словаре (поиск по ключу):

>(send dictionary :answer :find ‘(name &aux entry)

‘((cond ((setq entry (assoc name entries))

(cdr entry))

(t nil))))

#<object: #485742a8>

Поиск в словаре:

>(send d :find ‘mozart)

composer

>(send d :find ‘computer-fun)

nil

Для построения иерархии классов в сообщении :isnew к классу class необходимо указать в качестве 3-го параметра имя суперкласса. Класс наследует все переменные и методы суперкласса. В вершине иерархии классов расположен класс object. Если в некотором методе необходимо обратиться к методу суперкласса, то необходимо вычислить следующее выражение:

(send :sendsuper :селектор-сообщения e1 e2 …),

где e1 e2 … - выражения аргументов.

В документации указано на какие стандартные сообщения отвечают классы object и class. В процессе работы можно добавить новые методы в эти классы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]