LINUX.ORG.RU

История изменений

Исправление 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)))

Это тоже, что-ли, ООП?