Пример 14.1. Классы, используемые для создания логических элементов
(defclass COMPONENT
(is-a USER)
(slot ID# (create-accessor write))
)
(defclass NO-OUTPUT
(is-a USER)
(slot number-of-outputs (access read-only)
(default 0)
(create-accessor read)) )
(defmessage-handler NO-OUTPUT compute-output ())
(defclass ONE-OUTPUT
(is-a NO-OUTPUT)
(slot number-of-outputs (access read-only)
(default 1)
(create-accessor read))
(slot output-1 (default UNDEFINED)
(create-accessor write))
(slot output-1-link (default GROUND)
(create-accessor write))
(slot output-1-link-pin (default 1)
(create-accessor write))
)
(defmessage-handler ONE-OUTPUT put-output-1 after (?value)
(send ?self:output-1-link
(sym-cat put-input- ?self:output-1-link-pin)
?value)
)
(defclass TWO-OUTPUT
(is-a ONE-OUTPUT)
(slot number-of-outputs (access read-only)
(default 2)
(create-accessor read))
(slot output-2 (default UNDEFINED)
(create-accessor write))
(slot output-2-link (default GROUND)
(create-accessor write))
(slot output-2-link-pin (default 1)
(create-accessor write))
)
(defmessage-handler TWO-OUTPUT put-output-2 after (?value)
(send ?self:output-2-link
(sym-cat put-input- ?self:output-2-link-pin)
?value)
)
(defclass NO-INPUT
(is-a USER)
(slot number-of-inputs (access read-only)
(default 0)
(create-accessor read)) )
(defclass ONE-INPUT
(is-a NO-INPUT)
(slot number-of-inputs (access read-only)
(default 1)
(create-accessor read))
(slot input-1 (default UNDEFINED)
(visibility public)
(create-accessor read-write))
(slot input-1-link (default GROUND)
(create-accessor write))
(slot input-1-link-pin (default 1)
(create-accessor write)) )
(defmessage-handler ONE-INPUT put-input-1 after (?value)
(send ?self compute-output)
)
(defclass TWO-INPUT
(is-a ONE-INPUT)
(slot number-of-inputs (access read-only)
(default 2)
(create-accessor read))
(slot input-2 (default UNDEFINED)
(visibility public)
(create-accessor write))
(slot input-2-link (default GROUND)
(create-accessor write))
(slot input-2-link-pin (default 1)
(create-accessor write))
)
(defmessage-handler TWO-INPUT put-input-2 after (?value)
(send ?self compute-output)
)
Класс component является абстрактным потомком класса user. Этот класс содержит единственный слот id# для идентификационного номера компонента и определяет для него акцессор записи. Класс будет являться суперклассом для всех классов логических элементов.
Набор классов no-output, one-output и two-output предназначен для реализации свойств элемента без выхода, с одним выходом и двумя выходами соответственно. Каждый следующий класс наследуется от предыдущего и добавляет к нему реализацию одного логического выхода.
Класс no-output имеет единственный слот number-of-outputs со значением по умолчанию 0 и доступен только для чтения. Этот слот предназначен для хранения числа выходов элемента, унаследованного от этого класса. Кроме того, класс no-output определяет обработчик compute-output, который унаследует и переопределит все логические элементы. Именно благодаря наличию этого обработчика объекты классов логических элементов смогут самостоятельно определять результат обработки полученных сигналов.
Класс one-output переопределяет слот number-of-outputs и назначает ему значение по умолчанию, равное 1. Кроме того, класс определяет набор слотов, предназначенных для описания логического выхода элемента, и связи этого выхода с последующими элементами схемы. Слот output-1 предназначен для хранения значения, образующегося на выходе элемента. По умолчанию слот имеет значение undefined. Слот output-1-link содержит имя объекта, с которым связан данный выход, и по умолчанию имеет значение ground. Слот output-1-link-pin содержит номер конкретного логического входа элемента, с которым связан данный выход, и по умолчанию равен 1. Класс one-output определяет after-обработчик put-outout-1, который сразу после присвоения значения слоту output-1 передает это значение на вход элемента, связанного с данным выходом.
Класс two-output тоже переопределяет слот number-of-outputs и присваивает ему значение по умолчанию, равное 2, а также добавляет набор слотов, предназначенных для описания второго логического выхода: output-2, output-2-link и output-2-link-pin и after-обработчик put-outout-2. Следует обратить внимание на тот факт, что слоты output-1, output-1-link и output-l-link-pin и обработчик put-outout-1 не переопределяются, а наследуются от класса one-output.
Набор классов no-input, one-input и two-input предназначен для реализации свойств элемента без входа, с одним входом и двумя входами соответственно. Каждый следующий класс наследуется от предыдущего и добавляет к нему реализацию еще одного логического входа. Назначение слотов, описывающих логический вход элементов input-x, input-x-link, input-x-link-pin, идентично назначению слотов, использующихся в классах one-output и two-output. Кардинальное отличие классов, реализующих логику входов элемента, заключается в том, что вместо обработчика put-outout-x классы реализуют after-обработчик put-inout-x. Этот обработчик вызывает обработчик сообщения compute-output сразу после получения нового значения.
После определения классов component, no-output, one-output, two-output, no-input, one-input и two-input можно приступать к созданию классов, реализующих логику отдельных элементов схемы. Начнем с простейших по своей функциональности элементов — source и led.
Дата добавления: 2021-12-14; просмотров: 286;