История изменений
Исправление monk, (текущая версия) :
Да лааааадно? А defmethod тогда что делает?
Что-то с памятью моей стало. Помню (или так думаю), что когда-то читал, что defmulti все методы в своём теле определяет. Может было очень давно, может неправда.
И ненужно. Нет, серьёзно, эту говнину потом гарантированно сам автор не поймёт через две недели
Даже в 1С, который очень консервативен, такое добавили (кроме комбинаторов, конечно). Всё-таки возможность добавить перед или после обработчика свой код для определённого типа очень удобна.
Например, хочу я шрифт на кнопках покрупнее сделать. В CL просто добавлю after после on-paint в класс button. А в любом другом надо или менять библиотечную функцию или менять весь код, который выводит кнопки (включая библиотечный), чтобы вместо button выводил my-button.
Для этого binding есть же.
Вот пример: есть у тебя сложная программа и есть в ней функция, меняющая глобальный механизм логирования ошибок (адрес сервера, протокол и прочее).
В Common Lisp у меня просто (setf *logger* new-logger)
. При этом не ломается нигде, где механизм указан явно или указано, что механизм должен не меняться для блока через (let ((*logger* *logger*)) ...)
. В современных языках «делайте синглтон и либо всю программу в него, либо тащите его как параметр повсюду». Как в Clojure?
Исходная версия monk, :
Да лааааадно? А defmethod тогда что делает?
Что-то с памятью моей стало. Помню (или так думаю), что когда-то читал, что defmulti все методы в своём теле определяет. Может было очень давно, может неправда.
И ненужно. Нет, серьёзно, эту говнину потом гарантированно сам автор не поймёт через две недели
Даже в 1С, который очень консервативен, такое добавили (кроме комбинаторов, конечно). Всё-таки возможность добавить перед или после обработчика свой код для определённого типа очень удобна.
Например, хочу я шрифт на кнопках покрупнее сделать. В CL просто добавлю after после on-paint в класс button. А в любом другом надо или менять библиотечную функцию или менять весь код, который выводит кнопки (включая библиотечный), чтобы вместо button выводил my-button.
Для этого binding есть же.
Вот пример: есть у тебя сложная программа и есть в ней функция, меняющая глобальный механизм логирования ошибок (адрес сервера, протокол и прочее).
В Common Lisp у меня просто (setf *logger* new-logger)
. При этом не ломается нигде, где механизм указан явно или указано, что механизм должен не меняться для блога через (let ((*logger* *logger*)) ...)
. В современных языках «делайте синглтон и либо всю программу в него, либо тащите его как параметр повсюду». Как в Clojure?