假設我們有兩個軟件包,每個軟件包定義一個類併爲相同名稱導出插槽/通用方法的符號。Common Lisp:CLOS和軟件包/如何導入和合並仿製藥
(defpackage pkg1 (:export _class1 _slot _reader _method))
(in-package pkg1)
(defclass _class1() ((_slot :initform "SLOT111" :initarg :slot :reader _reader)))
(defmethod _method ((self _class1)) (format t "SLOT-: ~a~%" (_reader self)))
(defpackage pkg2 (:export _class2 _slot _reader _method))
(in-package pkg2)
(defclass _class2() ((_slot :initform "SLOT222" :initarg :slot :reader _reader)))
(defmethod _method ((self _class2)) (format t "SLOT=: ~a~%" (_reader self)))
我們如何在第三個包中成功導入這些符號,成功合併(不是陰影)泛型?
(defpackage test)
(in-package test)
... ; here we somehow import symbols _slot, _reader and _method
; from both packages, so they get merged (like in 'GNU Guile' or 'Gauche')
(defvar v1 (make-instance '_class1))
(defvar v2 (make-instance '_class2))
(_reader v1) (_method v1) ; both must work
(_reader v2) (_method v2) ; and these too
定義的協議(/接口)這樣的意義,如果這些方法在概念上是不同類別相同的操作(作爲啓發式,如果一個文檔字符串可以有用地描述這兩種方法)。如果這些方法是完全不同的操作,那麼最好只使用包限定名稱,或者在方法名稱前加適當的(不同的)協議名稱。 – jkiiski
謝謝,但即使此解決方案有效,從設計的角度來看也是完全錯誤的。如果兩個軟件包** _ pkg1 **和** _ pkg2 **由不同的開發人員編寫和維護,該怎麼辦?那麼爲了工作雙方都應該意識到對方?爲什麼** _ class1 **和** _ class2 **必須共享一些共同的祖先,如果它們完全不相關? – AlexDarkVoid
@AlexDarkVoid我同意。如果我要設計一個lisp OOP系統,則導入將合併具有相同導入名稱的調度程序,如果它們的簽名是兼容的,並且連接將影響它們從中導入的庫,以便兩者都支持所有類型的導入庫以支持它們。除非你有一種編譯語言,否則它會變得混亂。 – Sylwester