Есть ли в LISP методы?
Формулировка задачи:
Здравствуйте уважаемые участники.
Разбираюсь сейчас с объектной системой лиспа, и возник такой вопрос.
Правильно ли я понимаю, что несмотря на то, что в лиспе есть определение "defmethod", на самом деле в качестве этого "метода" реально просто вызывается функция, и никаких сообщений там реально нет?
Могу ли я реализовать какой-то перехватчик, как например
?
Но пишут, что она не совместима со множественной диспетчеризацией. Есть ли еще варианты, которые не конфликтуют с объектной системой?
test = function(argument){print(argument)}// обычная функция myObject.undefinedMethod(test(100)) // вызов несуществующего метода, в качестве аргумента подаем вызов функции, печатающей свой аргумент. В myObject определен перехватчик типа "no such method", который просто выводит строку "no such method" // в итоге получаем >> no such method // побочный эффект функции test не выполнился
UPD нашел вот такую вот реализацию,
; Default method-missing (defmethod method-missing (m (self t) &rest args) (format t "~s not found, no replacement method provided!~%" (cons m (cons self args))) ; Should throw an exception ... nil ) ; Override global no-applicable-method handler (defmethod no-applicable-method (m &rest args) (format t "~s not found, calling method-missing!~%" (cons m args)) (apply #'method-missing (cons m args)) ) ; Now it's possible to make limited dynamic proxies (defclass dynamic-proxy () ((obj :accessor obj :initarg :obj))) (defun make-dynamic-proxy (obj) (make-instance 'dynamic-proxy :obj obj)) (defmethod set-obj ((self dynamic-proxy) new-obj) (setf (slot-value self 'obj) new-obj)) (defmethod method-missing (m (self dynamic-proxy) &rest args) (apply m (cons (obj self) args)) )
Решение задачи: «Есть ли в LISP методы?»
textual
Листинг программы
(arg + 1) print >>23
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д