Есть ли в 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д