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