2012-02-20 3 views
8

다양한 요소에 대해 HTML을 내보내는 몇 가지 방법을 쓰고 있습니다. 각 메소드는 동일한 출력을 가지지 만 반드시 동일한 입력을 필요로하지는 않습니다.defgeneric의 선택적 인수는 무엇입니까?

(각 플레이어는 자신의 조각을 볼 수 있기 때문에) 그 파견 실제로 (선수 당 변경이 필요없는 보드 공간을 반향

(defmethod echo ((board game-board) (p player)) ...) 

뿐만 아니라 player을 위해 game-board 요구를 반향하는 방법 game-board 메서드에서 수행되며 나중에 공간에서 echo을 호출합니다. 이상적으로, 나는

(defmethod echo ((space board-space)) ...) 
(defmethod echo ((space empty-space)) ...) 

그것은 나중에 제대로 자체를 표시하기 위해 단지 플레이어보다 더 알아야 할 객체로 실행하는 것도 생각할 수 할 수있을 것입니다. 오류

The generic function #<STANDARD-GENERIC-FUNCTION ECHO (4)> takes 2 required arguments; 

을 줄 것이라고하지만, 같은 일반에 전문 방법이 이미 있기 때문에 그것은 돌아가서 이러한 방법 echo-space, echo-board 등의 이름을 이상적보다 적은 것 같다.

특수한 객체를 기반으로 다른 인수를 변경하는 표준 방법이 있습니까? 나는

(defgeneric echo (thing &key player ...) ...) 

또는

(defgeneric echo (thing &rest other-args) ...) 

그런 짓을해야 하는가? 좀 더 일반적으로, 누구나 구체적으로 defgeneric에 대한 적절한 튜토리얼을 가르쳐 줄 수 있습니까? (필자는 관련 PCL 장을 읽고 some CLOS tutorials을 읽었지만 여기서는 내가 요구하는 상황을 다루지 않습니다.)

답변

5

일반적으로 두 기능의 인터페이스가 너무 다른 경우 해당 기능이 실제로 동일한 작업의 특수화가 아니며 동일한 이름을 갖지 않아야 함을 나타냅니다. 옵션/키 인수를 전문으로하고 싶다면이를 달성하는 방법은 일반 함수를 호출하는 일반 함수를 사용하고 누락 인수에 기본값을 제공하여이를 특수화하는 것입니다.

Keene's book은 CLOS에 대한 가장 포괄적 인 가이드입니다. 불행히도 책 형태로만 제공되는 것 같습니다.

+0

일반에 대한 함수 디스패치가 만족스럽지 않은 것 같습니다 (즉, echo-board/echo-space/etc 영역에 다시 연결됨). 나는 네가이 경우에 맞다고 생각해. 나는 'echo'(순진하게 단일 항목을 출력하기 위해)와 별도의'echo-tailored' 또는 유사한 (추가 매개 변수를 기반으로 출력을 변경하는) 같은 것을 정의하는 것이 더 나을 것이다. – Inaimathi

+0

비 제네릭 함수는 디스패치를 ​​수행하지 않고 단지 인수를 정규화합니다. 이것은 명백히 일반 (및 메소드)이 가능한 모든 인수를 취할 것을 요구합니다. 이는 인터페이스가 실제로 유사 할 때만 유용합니다. – Ramarren

+0

다음은 Keene의 저서입니다. (합법적 인 방법에 대해 모르겠으니 알려주십시오.) https://doc.lagout.org/programmation/Lisp/Object-Oriented%20Programming%20in%20Common%20Lisp_% 20A % 20 프로그래머 % 27s % 20 가이드 % 20to % 20CLOS % 20 % 5BKeene % 201989-01-11 % 5D.pdf –

0

에코하려는 각 객체가 고유 한 (상속 된) 슬롯에 모든 필수 속성을 갖도록 객체/클래스를 재구성하는 것은 어떻습니까?

그런 식으로 개체에 echo를 호출 할 때 인수로 전달하지 않아도됩니다. 필요한 것은 이미 개체에 저장되어 있기 때문입니다.

3

메소드가 동일한 매개 변수를 사용하지만 데이터 유형 만 다를 때마다 더 쉽습니다. 그러나 generic 함수와 메서드가 모두 동일한 이름을 사용하지만 람다 목록이 상당히 다를 경우 & 선택적 매개 변수를 사용하는 대신 개인적으로 & 키 매개 변수를 사용하여 내 의도를 명시 적으로 나타내야하는 경향이 있습니다. 나중에 가독성을 높이는 데 도움이된다고 생각합니다.

이 같은 (우리는 이미 클래스 클래스 A와 클래스 B를 척)을보십시오 :

"방법의 조합"을 통해 "흐름"에 파견 논리 위해서는, 관련되어 있기 때문에
(defgeneric foo (object &key &allow-other-keys) 
    (:documentation "The generic function. Here is where the docstring is defined.")) 

(defmethod foo ((object class-a) &key &allow-other-keys) 
    (print "Code goes here. We dispatched based on type Class A.")) 

(defmethod foo ((object class-b) &key (x 1) (y 2) &allow-other-keys) 
    (print "Code goes here. We dispatched based on type Class B. We have args X and Y.")) 

의 사용 가능한 메소드의 선택이 가능할 때, 우리는 호환되지 않는 람다리스트 (즉, 파라미터리스트)가 그 체인을 깨뜨릴 수있는 체인처럼 메소드 정의를 생각할 필요가있다. 이것이 구체적으로 필요하지 않은 메소드 정의에 & 키와 & allow-other-keys가있는 이유입니다. 이를 DEFGENERIC과 메소드 정의에 넣으면 클래스 -b를 기반으로 메소드를 정의 할 수 있습니다.

실례 : 나는 Common Lisp 초보자 다. 그래서 이것을 소금 한알과 함께 가져라!

관련 문제