2011-12-15 9 views
2

이 코드는 경고 메시지를 제외하고는 원하는대로 작동합니다. GNU Common Lisp에서 다른 가능한 경고 메시지를 억제하지 않고 어떻게 메시지를 표시하지 않을 수 있습니까? Vatine의 종류 응답에 응답GNU clisp : 적용 할 수없는 메소드에 대한 경고 메시지를 표시하지 않음

1 (defgeneric zang (x y) 
2 (:documentation "they want you to put documentation here")) 
3 (defmethod zang ((a number) (b string)) 
4 (format t "got to zang ((~s number) (~s string))~%" a b)) 
5 (defmethod zang ((a integer) (b string)) 
6 (format t "got to zang ((~s integer) (~s string))~%" a b) 
7 (when (evenp a) 
8  (format t "passing control to the other guy~%") 
9  (call-next-method (1+ a) "hoo boy") 
10  (format t "returned control from the other guy~%"))) 
11 (defmethod no-applicable-method (zang &rest args) 
12 (format t "no applicable method for (zang ~{~s~^ ~})~%" args)) 
13 (zang 3.5 "hi") 
14 (zang 3 "hi") 
15 (zang 4 "hi") 
16 (zang "hello" "world") 
WARNING: Replacing method #<STANDARD-METHOD (#<BUILT-IN-CLASS T>)> in 
     #<STANDARD-GENERIC-FUNCTION NO-APPLICABLE-METHOD> 
got to zang ((3.5 number) ("hi" string)) 
got to zang ((3 integer) ("hi" string)) 
got to zang ((4 integer) ("hi" string)) 
passing control to the other guy 
got to zang ((5 number) ("hoo boy" string)) 
returned control from the other guy 
no applicable method for (zang "hello" "world") 

편집는 :

나는 것을 시도하고, 상황은 치명적인 오류로 경고 에스컬레이션 : 내가 생각

(defgeneric zang (x y) 
    (:documentation "they want you to put documentation here")) 
(defmethod zang ((a number) (b string)) 
    (format t "got to zang ((~s number) (~s string))~%" a b)) 
(defmethod zang ((a integer) (b string)) 
    (format t "got to zang ((~s integer) (~s string))~%" a b) 
    (when (evenp a) 
    (format t "passing control to the next guy~%") 
    (call-next-method (1+ a) "hoo boy") 
    (format t "returned control from the next guy~%"))) 
;(defmethod no-applicable-method (zang &rest args) 
; (format t "no applicable method for (zang ~{~s~^ ~})~%" args)) 
(defmethod no-applicable-method ((zang eql #'zang) &rest args) 
    (format t "no applicable method for (zang ~{~s~^ ~})~%" args)) 
(zang 3.5 "hi") 
(zang 3 "hi") 
(zang 4 "hi") 
(zang "hello" "world") 
*** - DEFMETHOD NO-APPLICABLE-METHOD: Invalid specialized parameter in method 
     lambda list ((ZANG EQL #'ZANG) &REST ARGS): (ZANG EQL #'ZANG) 
+0

가 인쇄 "방법을 교체"경고를 억제 여부를 하시겠습니까? " 해당 방법 없음 "? –

+0

"WARNING : Replacing method"로 시작하는 두 줄을 표시하지 않으려합니다. –

답변

4

NO-APPLICABLE-METHOD에 대한 올바른 인수 목록을 제공해야합니다. 컴파일러를 사용하는 경우 (심지어 CLISP 구현이 COMPILE-FILE을 통해 컴파일 할 수 있음) 컴파일 타임에 잘못된 인수 목록에 대한 오류 메시지가 표시됩니다.

예제의 LispWorks 컴파일러는 말한다 :

**++++ Error between functions: 
An argument is not an atom or list of two elements : (ZANG EQL (FUNCTION ZANG)) 

고정 버전 :

(defgeneric zang (x y) 
    (:documentation "they want you to put documentation here")) 
(defmethod zang ((a number) (b string)) 
    (format t "got to zang ((~s number) (~s string))~%" a b)) 
(defmethod zang ((a integer) (b string)) 
    (format t "got to zang ((~s integer) (~s string))~%" a b) 
    (when (evenp a) 
    (format t "passing control to the next guy~%") 
    (call-next-method (1+ a) "hoo boy") 
    (format t "returned control from the next guy~%"))) 
;(defmethod no-applicable-method (zang &rest args) 
; (format t "no applicable method for (zang ~{~s~^ ~})~%" args)) 

(defmethod no-applicable-method ((zang (eql #'zang)) &rest args) 
    (format t "no applicable method for (zang ~{~s~^ ~})~%" args)) 

예 :

(defun test() 
(zang 3.5 "hi") 
(zang 3 "hi") 
(zang 4 "hi") 
(zang "hello" "world")) 

CL-USER 1 > (test) 
got to zang ((3.5 number) ("hi" string)) 
got to zang ((3 integer) ("hi" string)) 
got to zang ((4 integer) ("hi" string)) 
passing control to the next guy 
got to zang ((5 number) ("hoo boy" string)) 
returned control from the next guy 
no applicable method for (zang "hello" "world") 
NIL 
+1

이것은 효과가있었습니다. 설명서를 이해할 수있는 능력은 null이 아니지만 완벽하지는 않습니다. 이 올바른 구문의 예는 문서로 돌아가는 데 도움이 될 것입니다. 고맙습니다! –

+0

명확해야 : 솔루션의 일부는 대체 코드의 두 번째 "zang"이 그대로 철자가되는 것입니다. 그러나 실제로이 매개 변수를 사용하지 않으므로 첫 번째 "zang"은 임의로 철자를 지정할 수 있습니다. 예 : ((fred (eql 'zang)) –

+1

@Bill Evans at Mariposa : ((zang (eql #'zang)) & rest args와 같은 매개 변수 목록은 첫 번째 zang이 매개 변수 이름임을 의미합니다. 이 메소드가 실제 인수와 일치하도록하려면 함수 zang의 함수 객체에 대한 EQL이어야합니다. 이것은 두 번째 zang입니다 –

3

적용 할 수없는 메소드의 메소드를 다음과 같이 정의하려고합니다 :

(defmethod no-applicable-method ((zang (eql #'zang)) &rest args) 
    ...) 

마찬가지로, 모든 제네릭 함수에 적용되는 메서드를 선언하고 있으므로 clisp가 이미 정의 된 메서드를 대체한다는 것을 알려줍니다.

+0

당신이 뭔가있는 것 같아요,하지만 그 구문은 작동하지 않습니다; 내 질문을 편집하십시오. 어쨌든 고마워. :) –

+1

나는 "eql # 'zang"부분 주위에 괄호가 필요하다고 생각합니다. – Vatine

+0

예. Rainer가 그것을 못 박았습니다. 하지만 돌아와 줘서 고마워. –