История изменений
Исправление timdorohin, (текущая версия) :
Ты об этом?
Если чесно, никогда не понимал необходимость делать такое (хоть я к ООП отношусь _очень_ прохладно, функциональшина мне больше по вкусу)
Но да, заглушку на стандартную функцию повесить таки придется...
? (shadow '+)
? (defgeneric + (a &rest b))
? (defmethod + ((a number) &rest b) (apply 'cl:+ a b))
? (+ 1 2)
3
? (+ 2 3 4)
9
? (defmethod + ((a string) &rest b) (apply #'cl:concatenate 'string a b))
? (+ "Hello" "World")
"HelloWorld"
? (+ "Hello" " cruel " "World")
"Hello cruel World"
? (defmethod + ((a vector) &rest b) (apply #'map 'vector 'cl:+ a b))
? (let ((v0 #(1 2 3)) (v1 #(4 5 6))) (+ v0 v1))
#(5 7 9)
Исправление timdorohin, :
Ты об этом?
Если чесно, никогда не понимал необходимость делать такое (хоть я к ООП отношусь _очень_ прохладно, функциональшина мне больше по вкусу)
Но да, заглушку на стандартную функцию повесить таки придется...
(defpackage #:generic-arithmetic
(:use "COMMON-LISP")
(:shadow "+"))
(in-package #:generic-arithmetic)
(defun + (&rest addends)
(reduce 'binary+ (cdr addends) :initial-value (car addends)))
(defgeneric binary+ (addend1 addend2))
(defmethod binary+ ((x number) (y number))
(cl:+ x y))
(defmethod binary+ ((x vector) (y vector))
(map 'vector 'cl:+ x y))
(defmethod binary+ ((x list) (y list))
(map 'list 'cl:+ x y))
Исходная версия timdorohin, :
Ты об этом?
Если чесно, никогда не понимал необходимость делать такое (хоть я к ООП отношусь _очень_ прохладно, функциональшина мне больше по вкусу)
Но да, заглушку на стандартную функцию повесить таки придется...