Peter Seibel - Lisp
Формулировка задачи:
Здравствуйте.
Присматриваюсь сейчас к лиспу, особенно к его ООП.
В целом все нравится, но отталкивает слабость интеллекта некоторых "лисп-гуру", на которых часто наталкиваешься при чтении различной литературы.
В частности, был неприятно удивлен "мнением" Peter Seibel, который выдвигает не то что бы абсурдный, а по-просту глупый аргумент против message-passing. Он вопрошает, что, дескать, если мы возьмем звук барабана, то должны ли мы его считать функцией барабана, или функцией палочки?
Тут стоит заметить, что данный персонаж, видимо, кроме всего прочего, еще и физику слабовато знает. По сути, звук излучается барабаном, его мембраной, поэтому, в смысле моделирования тут вообще никаких противоречий нет.
Ну, ладно, возьмем его "упрощенную" версию.
С чего он взял, что звук является "функцией"? Разве это не событие? Ту же самую претензию можно предъявитить, скажем, паттерну наблюдатель: оповещение является функцией наблюдателя или наблюдаемого? А функция в каком смысле, в смысле подпрограммы или отображения?
Ну ладно, допустим это какая-то там функция в смысле того, что это объект производящий некоторые действия над предметами. Тогда по-его мнению, конструкция "ЗвукДелать(палочка, барабан)" является адекватной абстракцией? Или "звукануть(палочка, барабан)"? Так что-ли? А ничего, что звук -- это на минуточку, имя существительное, и к тому же производное от действий барабанщика? То есть у него звук вместо барабанщика стучит по барабану?
В общем, понятно, что творится у автора в голове, такие ООП-специалисты явно не нужны.
Как соориентироваться в литературе, чтобы не попадать на подобных "гуру"? Каких авторов можно почитать, с более адекватным взглядом, и более квалифицированных в вопросах проектирования?
Решение задачи: «Peter Seibel»
textual
Листинг программы
(defclass foo () () (:metaclass closer-mop:funcallable-standard-class)) (defmethod initialize-instance :after ((object foo) &key &allow-other-keys) (closer-mop:set-funcallable-instance-function object (lambda (&rest args) (values-list args)))) (funcall (make-instance 'foo) :a :b :c) ;; :A ;; :B ;; :C
Объяснение кода листинга программы
В коде определён класс foo, который представляет собой экземпляр класса closer-mop:funcallable-standard-class. Это значит, что объекты этого класса являются функциями. Также определён метод initialize-instance, который является методом инициализации для этого класса. В нём устанавливается функция, которая будет являться экземпляром класса. Эта функция будет принимать произвольное количество аргументов и возвращать список этих аргументов.
Затем создаётся экземпляр класса foo с помощью функции make-instance. У этого экземпляра вызывается функция с аргументами :a, :b и :c.
В результате выполнения кода на экран будут выведены аргументы, которые были переданы в функцию, то есть :a, :b и :c.