Есть ли в 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5