【发布时间】:2015-01-21 00:29:27
【问题描述】:
我想要做的是:
(defgeneric fn (x))
(defmethod fn ((x (integer 1 *)))
"Positive integer")
(defmethod fn ((x (integer * -1)))
"Negative integer")
我想要一个与任意类型说明符一起使用的通用函数,包括基于列表的类型说明符,例如(and x y)、(or x y)、(satisfies p) 等。现在当我尝试运行上述代码时,我得到一个“无效的专业化程序”错误。一些研究表明defgeneric 旨在与 CLOS 一起使用,而不是与任意类型说明符一起使用。 Common Lisp 中是否有一个类似于 defgeneric 的系统,可以让我获得我想要的任意类型说明符的行为,而不仅仅是类?
【问题讨论】:
-
零是正负?
-
@RainerJoswig 已修复,但并没有真正改变问题的目的。
-
true,但它暴露了这样一个特性的问题。如果两种方法都匹配:使用哪一种?无法对方法进行排序...对于零,两种方法都是匹配的。应该使用哪一个?
-
@RainerJoswig 是的,但这不是什么大问题。例如 last 或 first 指定的 on 可以被执行。
-
@Coredump:这些后果无处不在。需要对整个类型系统进行排序。它将彻底改变系统的性质。它与零无关。与对象匹配的任何两种类型都需要具有可比性,否则行为将是随机的。
标签: types lisp common-lisp