Реферат: Программирование на языке CLIPS
)
Обработчик сообщения seat выполняет действия, противоположные тем, которые выполняет обработчик drop.
(defmessage-handler pistol seat ()
(dynamic-put magazine in)
)
Можно было бы, конечно, включить в программу и следующее правило mag-in:
(defrule mag-in
?gun <- (object (name [PPK]) (safety on ) (magazine out)) (range-test (fired no) (check yes))
=>
(modify ?gun (magazine in)
)
но это противоречит одному из принципов объектно-ориентированного программирования, который гласит, что объект должен самостоятельно обрабатывать содержащиеся в нем данные. Следующее правило обеспечивает снаряжение обоймы патронами:
(defrule load
(object (name [PPK]) (magazine in) (chamber 0))
=>
(send [PPK] rack)
)
На примере обработчика сообщения rack вы можете убедиться в справедливости нашего замечания о том, что обработку данных внутри объекта нужно поручать методам этого объекта, а не включать прямо в правило.
(defmessage-handler pistol rack ()
(if (> (dynamic-get rounds) 0)
then (dynamic-put chamber 1)
(dynamic-put rounds (- (dynamic-get rounds) 1))
(dynamic-put slide forward)
else (dynamic-put chamber 0)
(dynamic-put slide back)
)
)
В этом обработчике обеспечивается досылка патрона в патронник в том случае, если в обойме имеются патроны. Следующее правило подготавливает пистолет к стрельбе, снимая его с предохранителя. Обратите внимание на то, что в нем повторно используется сообщение safety, но на этот раз с аргументом off.
(defrule ready