2012-02-22 52 views
2

Common Lisp中是否有一種白話,用於定義匿名類,以Java的方式來定義一次性'小接口實現者'?匿名CLOS實例

例如,

this.addListener(new Listener() { 
    public void listen() {...} 
}); 

爲:

(defgeneric listen (object)) 

(add-listener #<this> 
    (make-anonymous-instance 
    (listen (object) ...))) 

回答

7

在Common Lisp的方法屬於通用的功能,而不是類,因此匿名的情況下,也沒有真正意義。根據具體情況,可以實現類似的目的,槽閉合或EQL專業人員。

擴展響應評論:

在頂級

在CL定義方法不能是可能的,但不是一個真正的好主意。如果不需要實際的實例,我會建議只是通常添加方法,可能EQL專用於符號或其他常量。

如果定義內聯行爲通常比較有用,那麼它表示接口是錯誤設計的,應該採用閉包而不是對象。如果你無法修復接口本身,那麼你可以定義一個只用於封裝閉包並添加一個調用閉包的方法的類,然後只需創建一個具有適當行爲的實例。

+0

好吧,這是有道理的,這樣的感謝。我理解方法與泛型函數的關係。如果在原始示例中,由'#'表示的實例將調用通用函數'偵聽添加偵聽器添加的偵聽器,那麼您會提出什麼建議? – nowbumja 2012-02-22 18:04:52

2

確實沒有。雖然有了MOP和一些宏觀學,但它可能是可能的。

在CLOS發展的早期階段,有像GENERIC-FLET這樣的建議。但它沒有達到標準。

2

Java中的匿名類幾乎總是用來實現匿名函數和閉包。在通常的lisp中,不需要模擬Java的匿名內部類,因爲函數是Common Lisp中的第一類類型。

如果是這種情況,那麼在Common Lisp的代碼看起來像:

(add-listener self (lambda (object) ...))