2012-02-22 3 views
2

일명 '작은 인터페이스 구현 자'를 위해 익명 클래스를 Java로 정의 할 수있는 방법으로 Common Lisp의 모국어가 있습니까? 같은 예를 들어익명 CLOS 인스턴스

,

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

: CL의 방법에서

(defgeneric listen (object)) 

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

답변

7

그러므로 익명의 인스턴스가 정말 이해가되지 않는 일반 기능하지 클래스에 속한다. 특정 상황, 물마루 마감 또는 EQL 전문 기술자에 따라 비슷한 목적을 달성 할 수 있습니다. 최고 수준의

CL에서 메소드를 정의하지가 가능하지만, 정말 좋은 생각 : 응답

확장은 언급합니다. 나는 정상적으로 메소드를 추가하는 것이 좋을 것이다. 실제 인스턴스가 필요하지 않다면 심볼이나 다른 상수를 전문으로 할 수도있다.

인라인 동작을 정의하는 것이 유용한 경우가 많으면 인터페이스가 잘못 설계되어 객체가 아니라 닫는 상태 여야합니다. 인터페이스 자체를 고칠 수 없다면 클로저를 감싸고 그 클로저를 호출하는 메서드를 추가하는 것만을 목적으로하는 클래스를 정의한 다음 적절한 동작을 통해 인스턴스를 슬롯에 추가하십시오.

+0

좋아. 일반 함수에 대한 메서드의 관계를 이해합니다. 원래 예제에서 '# '으로 표시된 인스턴스가 'add-listener'가 추가 한 리스너에서 수신하는 일반 함수를 호출합니다. 무엇을 제안하겠습니까? – nowbumja

2

정말이에요. 걸레 및 일부 거대학과 함께 가능할 수도 있지만.

CLOS 개발 초기 단계에서 제안 된 GENERIC-FLET과 같은 것이있었습니다. 그러나 표준으로 만들지는 못했습니다.

2

Java의 익명 클래스는 거의 항상 익명 함수 및 클로저를 구현하는 데 사용됩니다. common lisp에서는 함수가 Common Lisp에서 first-class 유형이기 때문에 Java의 익명 내부 클래스를 에뮬레이션 할 필요가 없습니다.

이 경우처럼, 다음 커먼 리스프의 코드가 보일 것이다, 즉, 의미가 감사 있도록

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