Анонимные экземпляры CLOS

Есть ли в Common Lisp народный язык для определения анонимных классов таким же образом, как в Java, для одноразовых «небольших разработчиков интерфейсов»?

Например,

this.addListener(new Listener() {
    public void listen() {...}
});

as:

(defgeneric listen (object))

(add-listener #<this>
  (make-anonymous-instance
    (listen (object) ...)))

person nowbumja    schedule 22.02.2012    source источник


Ответы (3)


В Common Lisp методы принадлежат универсальным функциям, а не классам, поэтому анонимные экземпляры не имеют особого смысла. Аналогичные цели могут быть достигнуты, в зависимости от конкретных обстоятельств, с помощью закрытия или специализации EQL.

Расширено в ответ на комментарий:

В CL определение методов не на верхнем уровне возможно, но не очень хорошая идея. Я бы предложил просто добавить метод в обычном режиме, возможно, EQL специализировался на символе или другой константе, если фактический экземпляр не нужен.

Если определение встроенного поведения полезно чаще, чем нет, то это указывает на то, что интерфейс спроектирован неправильно и должен принимать замыкание, а не объект. Если вы не можете исправить сам интерфейс, вы можете определить класс, единственная цель которого - обернуть закрытие и добавить метод, вызывающий это закрытие, а затем просто создать экземпляр с соответствующим поведением.

person Ramarren    schedule 22.02.2012
comment
Хорошо, это имеет смысл, так что спасибо. Я понимаю отношение методов к универсальным функциям. Если в исходном примере экземпляр, представленный '#‹this›', вызовет общую функцию 'listen' для слушателей, добавленных 'add-listener, что бы вы предложили? - person nowbumja; 22.02.2012

Не совсем. Хотя с помощью MOP и некоторой макрологии это возможно.

На ранней стадии разработки CLOS было предложено что-то вроде GENERIC-FLET. Но в стандарт это не вошло.

person Rainer Joswig    schedule 22.02.2012

Анонимные классы в Java почти всегда используются для реализации анонимных функций и замыканий. В Common Lisp нет необходимости эмулировать анонимные внутренние классы Java, поскольку function является типом первого класса в Common Lisp.

Если это так, то код на Common Lisp будет выглядеть так:

(add-listener self (lambda (object) ...))
person dmitry_vk    schedule 22.02.2012