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.

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


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

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

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