당신이 ((complement odd?) 2)
이 정의에 빨간색 것을 볼 수 있습니다이 코드를 실행하면 다음과 같은 오류를 얻을 때 :
application: not a procedure;
expected a procedure that can be applied to arguments
given: #<void>
은 그래서 의미
(complement odd?)
는 절차하지만 값
#<void>
을 반환하지 않습니다.
(complement odd?)
; ==> nothing (aka #<void>)
당신이 정말 어딘가에 사용을 참조하십시오 : 것을 시도하자
(list (complement odd?))
; ==> (#<void>) now you see it
당신이 complement
에 cond
에서 모든 가능한 수표를 취급하지 않는 내가 왜 볼 것을 의미한다 .. comp
을 사용해 보셨습니까?
(comp f (lambda (g) g)) ; ==> #<procedure>
분명히 comp
의 사용이 절차가됩니다. 본문에는 반환이 절차임을 나타내는 람다 형식이 있으므로 이상하지 않습니다. 결코 없을 것입니다 #t
또는 #f
else
(기본값) 조건이 true가 아닐 때를 나타냅니다. cond
은 구현 관련 defauls 값을 반환합니다. Racket에서는 #<void>
이 REPL에 의해 압도되어 있지만 다른 구현에서는 banana
이거나 구현자가 원하는대로 항상 else
절이 있어야합니다. 필요하다고 생각하지 않는다면 (else (error "should never happen"))
을 수행하면됩니다. (시도해보십시오)
cond
의 결과는 #t
과 #f
입니다. 당신이 프로 시저로 결과를 사용하고 있기 때문에 오류가 될 것이다 절차 아닌 수익의 smething 각 장소를
application: not a procedure;
expected a procedure that can be applied to arguments
given: #t
: 그것은 당신의 코드가 일한 sould 경우이 오류 대신 메시지를 가지고 것을 의미 . 항상 프로 시저를 리턴하도록 구현을 변경해야합니다.
그래서 "not a procedure"오류를 찾는 방법에 대한 대답입니다. 프로 시저를 수정하는 방법에 대한 대답은 아니지만이 프로 시저가 전 세계에서 가장 간단한 프로 시저이므로 추가 할 것입니다. 프로 시저 comp
을 사용하면 두 개의 프로 시저를 사용하여 두 프로 시저를 반환합니다. 예. add2를 원하면 (define add2 (comp add1 add1))
수 있습니다. complement
은 허위 값 #f
이 #t
으로 바뀌고 모든 참 값은 #f
으로 바뀌어야합니다. not
이 너무 not
및 odd?
의 구성이 작동 절차가 될 않습니다 같은 even?
로 :
(define (complement f)
(comp not f)) ; comp returns a procedure always
(define my-even? (complement odd?))
(my-even? 2) ; ==> #t
우리는 당신이 무엇을 확인하는 대체 방법을 사용할 수 있습니다 아무것도 변이하지 않기 때문에 :
(my-even? 2) ; ==>
((comp not odd?) 2) ; ==>
(((lambda (x) (not (odd? x))) 2) ; ==>
(not (odd? 2)) ; ==>
(not #f) ; ==>
#t
'보완'을 구현 한 것이 엉망입니다. 그것은 단지 논쟁으로'not'을 구성 할 필요가 있습니다. 보완은 절차를 반환해야합니다.나는 'cond'가'# f','# t' 그리고 빠진'else' 절에 대해 정의되지 않은 값을 반환하는 것을 볼 수 있으며 그 중 아무 것도 프로 시저가 아니므로 적용하려고하면 "프로 시저가 아닙니다" 결과. – Sylwester
어떻게 해결할 수 있습니까? – siri
단지'comp'를 사용하여'cond'를 갖는 것으로부터'complement'를 변경합니다. '(odd? x)'의 보수는'(not (odd? x))'이므로'((comp to odd?) x)'입니다. – Sylwester