문제
나는 방금 SICP를 통해 일하기 시작했고 (내 혼자; 이것은 수업을위한 것이 아닙니다), 나는 며칠 동안 운동 1.6으로 어려움을 겪고 있었고 그것을 알아낼 수없는 것 같습니다. 이것은 Alyssa가 다시 정의하는 곳입니다 if
측면에서 cond
, 그렇게 :
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause))
그녀는 몇 가지 간단한 경우에서 성공적으로 테스트 한 다음이를 사용하여 Square Root 프로그램을 다시 작성합니다 ( if
):
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
그런 다음 질문은 다음과 같이 묻습니다. "Alyssa가 이것을 정사각형 뿌리를 계산하기 위해 이것을 사용하려고 시도 할 때 어떻게됩니까? 설명하십시오." [필요한 경우 다른 절차를 재현하게되어 기쁩니다 (good-enough?
, improve
, 등), 그냥 알려주세요.
이제 나는 무슨 일이 일어나는지 알고 있습니다. 그것은 결코 값을 반환하지 않기 때문에 프로그램이 무한히 되돌아갑니다. 왜 이런 일이 일어나는지 설명 할 수 없습니다. 미묘한 차이가 무엇이든간에 if
그리고 new-if
나를 피하고 있습니다. 모든 것이 큰 감사를 표합니다.
해결책
new-if
기능입니다. 함수가 호출되면 체계가 인수 목록에서 가장 먼저하는 일은 무엇입니까? 평가합니다 모두 논쟁.
다른 팁
new-if
절차이며, 계획은 응용 주문 평가 (1.1.5)를 사용하므로 이전에도 new-if
실제로 수행됩니다. 먼저 모든 인수를 평가해야합니다. guess
그리고 (sqrt-iter (improve guess x) x)
. 후자의 주장은 재귀이며 새로운 new-if
절차, 이것이 무한 루프가 발생하는 방식입니다.
평범한 if
먼저 주장을 평가할 필요는 없습니다. 그냥 길을 따라 가십시오. 이것이 차이입니다. if
그리고 new-if
. :)
우선 당신은해야합니다 차이를 이해하십시오 적용 주문 평가와 정상 순서 사이. LISP는 적용 순서를 사용하지만 조건부 표현은 정상적인 기능과 같지 않은 것으로 평가됩니다 (SICP 1.1.6 장):
(if <predicate> <consequent> <alternative>)
IF 표현을 평가하기 위해 통역사는 평가하여 시작합니다.
<predicate>
표현의 일부. 만약<predicate>
실제 가치로 평가하고 통역사는 다음을 평가합니다.<consequent>
그리고 그 가치를 반환합니다. 그렇지 않으면 평가합니다<alternative>
그리고 그 가치를 반환합니다.
Ex1.6. NEW-IF :
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
'If Statements'와의 차이 : IF 진술은 술어에서 하나씩 평가 -> 결과 -> 대안으로 평가합니다.
그러나 'New-IF'는 모든 매개 변수를 평가해야합니다. 일명 인수는 그 순간 ( 'else-clause'를 의미하는 순간)를 평가해야합니다.
따라서 이러한 매개 변수 중 하나라도 반복 루프로 호출 할 때 무한 루프가 발생합니다.