Common Lisp定义了两个相关但不相同的层次结构:类型层次结构和类层次结构。每个类都是一个类型,但反过来不是真的 - 有类型不是类。例如,integer
和string
是类,因此也是类型。另一方面,(integer 1 *)
和(satisfies evenp)
是类型,但不是类。
> (type-of "toto")
(SIMPLE-BASE-STRING 4)
> (class-of "toto")
#<BUILT-IN-CLASS STRING>
参数specialisers - 您在defmethod
参数后,把东西 - 只能是类名(或形式(eql value)
的)。由于(integer 1 *)
不是类名,Common Lisp不允许您的代码。有一个很好的理由:编译器总是能够确定的类层次结构,而该类型的语言是那样过于强大:
(defun satisfies-the-collatz-conjecture (n)
(cond
((<= n 1) t)
((evenp n) (satisfies-the-collatz-conjecture (/ n 2)))
(t (satisfies-the-collatz-conjecture (+ 1 (* n 3))))))
(subtypep 'integer '(satisfies satisfies-the-collatz-conjecture))
NIL ;
NIL
如果你真的需要你的代码是模块化的,您需要首先你的价值观分为东西可以做成一个specialiser,然后对调度:
(defmethod fn-generic (x (sign (eql 'positive)))
"Positive integer")
(defmethod fn-generic (x (sign (eql 'negative)))
"Negative integer")
(defun classify (x)
(cond
((< x 0) 'negative)
((= x 0) 'null)
((> x 0) 'positive)))
(defun fn (x)
(fn-generic x (classify x)))
来源
2014-11-23 13:17:16
jch
零是正面还是负面? – 2014-11-23 04:58:45
@RainerJoswig修正了,但并没有真正改变问题的目的。 – 2014-11-23 05:01:31
是真实的,但它暴露了这样一个功能的问题。如果两种方法匹配:使用哪一种?方法不能被排序...对于零,两种方法都是匹配的。哪一个应该被使用? – 2014-11-23 05:09:24