Math “通用lisp”;超载“;以可移植且高效的方式实现内置功能?

Math “通用lisp”;超载“;以可移植且高效的方式实现内置功能?,math,coding-style,common-lisp,overloading,Math,Coding Style,Common Lisp,Overloading,例如,如果我想为向量或四元数等定义新的算术运算。 我做了一些类似于(defunv+(&rest向量)…) 有没有一种好方法可以过载正常的+?(我只知道阴影导入,这似乎不是一个好的解决方案) 如果我使用+,则需要更多的时间来确定操作类型 最好不要重载,使用不同的函数名,并仅在真正需要时定义新函数?您可能想做的是定义一个包(我们称之为my math),在其中定义一个符号my math:+,它可以执行您需要的任何调度 或者,定义my math:+,使其有效地(减少#'my-math:binary+ar

例如,如果我想为向量或四元数等定义新的算术运算。 我做了一些类似于
(defunv+(&rest向量)…)

有没有一种好方法可以过载正常的
+
?(我只知道阴影导入,这似乎不是一个好的解决方案)

如果我使用
+
,则需要更多的时间来确定操作类型


最好不要重载,使用不同的函数名,并仅在真正需要时定义新函数?

您可能想做的是定义一个包(我们称之为
my math
),在其中定义一个符号
my math:+
,它可以执行您需要的任何调度

或者,定义
my math:+
,使其有效地
(减少#'my-math:binary+args)
,然后将
my math:binary+
定义为一个通用函数,然后可以挂起特定的方法


在编写依赖于
my math
的包定义时,这仍然需要一些额外的规则,因为您需要努力确保您未经修饰的
+
来自
my math
,而不是
cl
,这可能会使其他人更难阅读代码。

可移植,仅使用另一个
+
符号,如所示。即使您尝试以不可移植的方式进行,您也将面临去优化或代码遍历(或环境检查),因为
cl:+
可能有一个编译器宏或一些内部编译器构造,允许它根据声明的类型生成更快的编译代码。