operator-overloading - 覆盖/重载 + 运算符以对常见的 lisp 向量进行操作

标签 operator-overloading common-lisp overriding

我希望重载 + 运算符以处理常见的 lisp 向量——就像处理线性代数中的向量一样。是否可以使用 + 过载?运算符(operator)?

这是我的预期定义:

 (defmethod + ((v1 vector) (v2 vector))

在此先感谢所有帮助!

最佳答案

如果我要这样做,我会首先在一个单独的包中进行。然后我将编写一个使用二元运算符的通用函数:

(defun + (&rest addends)
  (reduce #'binary+ (cdr addends) :initial-value (car addends)))

(defgeneric binary+ (addend1 addend2))
然后你可以在泛型函数 binary+ 上定义方法这将允许您添加两个向量,一个向量和一个标量,...
这将是一个合适的包装器生成宏:
(defmacro define-operator (op &key (binary-signifier :binary) (package *package*)
  "Defines a generic operator OP, being essentially a reduce operation using
   a generic function whose name is a concatenation of BINARY-SIGNIFIER and OP."
  (let ((op op)
        (binary (intern (concatenate 'string
                                          (string  binary-signifier)
                                          (string op))
                        package)))
    `(progn
       (defun ,op (&rest args)
          (reduce (function ,binary) (cdr args) :initial-value (car args)))
       (defgeneric ,binary (arg1 arg2)))))
然后您可以根据 Joshua Taylor 的回答定义方法:
(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))

关于operator-overloading - 覆盖/重载 + 运算符以对常见的 lisp 向量进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25152029/

相关文章:

c++ - 关于运算符重载的问题

lisp - 寻找一个可以帮助我为 lisp 程序生成每个函数统计代码行的程序

lisp - 如何启动 Hunchentoot?

scala - 如何定义不可变的 Set 比较方法将使用的自定义相等操作

c++ - 运算符重载并出现友元函数错误

c++ - 在 C++ 中重载运算符时,为什么 T* 优于 bool?

c# - 重载 "Set to equal to"运算符

function - 执行函数后如何退出 lisp 中的循环?

java - 如何在调度更多事件之前等待 JOptionPane 关闭

java - Number对象如何在java中打印值?