LINUX.ORG.RU

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

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

Ты об этом?

Если чесно, никогда не понимал необходимость делать такое (хоть я к ООП отношусь _очень_ прохладно, функциональшина мне больше по вкусу)

Но да, заглушку на стандартную функцию повесить таки придется...