Из чтения книги по Лиспу я помню, что они показали пример диспетчера методов в стиле ООП, основанного на замыканиях:
(defun create-object ()
(let ((val 0)
(get (lambda () val))
(set (lambda (new-val) (setq val new-val)))
(inc (lambda () (setq val (+ 1 val)))))
(lambda (method)
(cond ((eq method 'get)
get)
((eq method 'set)
set)
((eq method 'inc)
inc)))))
(let ((obj (create-object)))
(funcall (obj 'set) 1)
(funcall (obj 'inc))
(funcall (obj 'get))) ;; 2
Поскольку это всего лишь функция с аргументом-символом string, я думаю, что информация о коде здесь не поможет, не заполняя имена методов или их подписи. (Сравните с аналогичным объектом JavaScript.)
Эта проблема вообще решается? Как вы программируете объектную систему в Scheme, чтобы редактор (например, Emacs) мог работать с вашим кодом более интеллектуально?
P.S. Пример может быть недействительным кодом Схемы, но вы должны уловить идею.
__dir__
, которая будет возвращать все возможные ключи, которые можно использовать для объекта. - person Loïc Faure-Lacroix   schedule 19.11.2013eq
в строках, как правило, не является хорошей идеей, поэтому было бы более распространенным сравнение символов (например,(eq method 'get)
) и выполнение завершения на основе символов, которые видел читатель. - person Joshua Taylor   schedule 19.11.2013