我有文件
R
和两个文件 A
、B
。
R
始终加载。
A
xor B
根据平台功能加载。我有一个无论平台如何都应该存在的函数,称之为F
。
使用的优点/缺点是什么:
DEFGENERIC
位于 F
中的 R
上,然后 DEFMETHOD
位于 F
、A
中的
B
DEFUN
位于 F
上,A
、B
'从表面上看,它们应该是相同的。这不仅仅是一个偏好问题吗?
我目前正在使用第一种方法,因为它清楚地表明该函数是通用的并且具有实现,但我很好奇为什么它与第二种方法相比如此重要。
在我看来,在您的情况下使用
defgeneric
或 defun
的优点或缺点与一般情况没有什么不同,这意味着与通用函数和常规函数之间的通常选择相比,这里没有额外的限制。
一般来说,函数更简单,使用起来可能更高效,因为它们的要求更少(无调度、无方法组合等),但在实践中,存在很多优化,使区别变得不那么重要.
如果你有一个平台
A'
,通用函数可以帮助你,它几乎像A
,但有一些调整,在这种情况下你可以专门化一些方法。
在您的问题中,您考虑了两种选择,但请注意,您不仅限于此。例如,参见 Slime 定义了两个宏,
definterface
和defimplementation
,来注册一组必要的后端函数及其在各个平台上的实现。
您还可以查看按约定调用的各种库
trivial-*stuff*
,它们将各种特定于实现的代码合并在一起,以便在统一的接口下执行 *stuff*
操作。