История изменений
Исправление monk, (текущая версия) :
Ну как же не вылезти, когда появляются утверждения, что в ООП диспатчинг обязательно идет по одному аргументу.
Если рассматривать CLOS, то надо учитывать его относительно (одиночногог диспатчинга) низкую производительность. А если производительность не важна, то можно рассмотреть GLS: там обобщенные функции есть, а классов нет (и других ограничений CLOS типа конгруэнтности методов тоже нет):
(defgeneric foo)
(add-method
foo
(method ((x (and? integer? even?)))
(cl-format #t "foo on even int, (~a)~%" x)))
(add-method
foo
(method ((x (and? integer? odd?)))
(cl-format #t "foo on odd int, (~a)~%" x)))
(add-method
foo
(method ((x integer?))
(y (lambda (y) (> y 0)))
(cl-format #t "~a~%" (+ x y))))
(foo 2) ;; печатает "foo on even int, (2)"
(foo 3) ;; печатает "foo on odd int, (2)"
(foo 1 2) ;; печатает "3"
Это тоже, что-ли, ООП?
Исправление monk, :
Ну как же не вылезти, когда появляются утверждения, что в ООП диспатчинг обязательно идет по одному аргументу.
Если рассматривать CLOS, то надо учитывать его относительно (одиночногог диспатчинга) низкую производительность. А если производительность не важна, то можно рассмотреть GLS: там обобщенные функции есть, а классов нет (и других ограничений CLOS типа конгруэнтности методов тоже нет):
(defgeneric foo)
(add-method
foo
(method ((x (and? integer? even?)))
(cl-format #t "foo on even int, (~a)~%" x)
(call-next-method)))
(add-method
foo
(method ((x (and? integer? odd?)))
(cl-format #t "foo on odd int, (~a)~%" x)
(call-next-method)))
(add-method
foo
(method ((x integer?))
(y (lambda (y) (> y 0)))
(cl-format #t "~a~%" (+ x y))
(call-next-method)))
(foo 2) ;; печатает "foo on even int, (2)"
(foo 3) ;; печатает "foo on odd int, (2)"
(foo 1 2) ;; печатает "3"
Это тоже, что-ли, ООП?
Исходная версия monk, :
Ну как же не вылезти, когда появляются утверждения, что в ООП диспатчинг обязательно идет по одному аргументу.
Если рассматривать CLOS, то надо учитывать его относительно (одиночногог диспатчинга) низкую производительность. А если производительность не важна, то можно рассмотреть GLS: там обобщенные функции есть, а классов нет (и других ограничений CLOS типа конгруэнтности методов тоже нет):
(defgeneric foo)
(add-method
foo
(method ((x (and? integer? even?)))
(cl-format #t "foo on even int, (~a)~%" x)
(call-next-method)))
(add-method
foo
(method ((x (and? integer? odd?)))
(cl-format #t "foo on odd int, (~a)~%" x)
(call-next-method)))
(add-method
foo
(method ((x integer?))
(y (lambda (y) (> y 0))
(cl-format #t "~a~%" (+ x y))
(call-next-method)))
Это тоже, что-ли, ООП?