2014-03-01 4 views
0

Scheme 언어를 처음 사용합니다. 나는 "간단한 계획"책을 읽고, 다음 예를 통해 온 오전 :스키마 평가 예를 모르겠다.

(cond (empty? 3) 
     (square 7) 
     (else 9)) 

나는 그것을 실행하면 나는 각 콘드 표현이 개 인수를 취할 필요가 있음을 알고 3. 얻었다 "평가"에 대한 하나를 조건과 두 번째는 "대답"입니다. 평가판은 어디에 있고 답변은 어디에 있습니까? 왜 ?

답변

2

하지 실제 예입니다 : 당신은 쉽게 다시 한 번 함수 이름 empty? 사실 간주되기 때문에 다음 코드는 "ok"를 반환합니다 예를 들어,이 동작을 확인할 수 있습니다.

올바르게 이해 했으므로 각 절의 길이는 이고 길이는이며 인 결과는입니다. 조건은 다음과 같습니다. 빈?, 평방기타. 대답은 , 및 입니다.

cond#t으로 평가되는 첫 번째 조건을 찾습니다. Scheme에서, (#f 제외). 그래서 첫 번째 조건이 true로 평가 :

> (if empty? "true" "false") 
"true" 

cond는 첫 번째 결과, 를 반환합니다. cond위한

1

cond 식을 작성하는 올바른 방법은 다음과 같습니다

그래서
(cond ((even? 3) 3) 
     ((odd? 5) 5) 
     (else -1)) 

당신이 볼, 술어 표현 각 조항의 왼쪽에 있고 그 중 하나에 해당하는 경우 다음 식에의 right가 평가되어 마지막 값을 반환합니다. 위 예에서 5이 반환됩니다. empty? 기능 (때문에 명시 적으로 #f 사실로 간주됩니다 아니에요 계획 아무것도에) #t으로한다, 그래서 첫 번째 절은 사실이고 오른쪽에있는 표현식이 평가 및 반환됩니다 코드에 대해서는

,이 무슨 일이 일어나고있다 이 경우는 3입니다.

(if empty? "ok" "not ok") 
+0

원래 코드는 cond 문을 작성하는 올바른 방법이기도합니다. – WorBlux

+0

@WorBlux는 문법적으로 그렇습니다. 그러나 쓸데없는 조건입니다. 첫 번째 조건은 항상 참입니다 ('empty? '가'# f'에 묶여 있지만 여전히 ...) –

1

구문은 다음 절은

(cond <clause1> <clause2> …) 

는 :

(<test> <expression1> …) 

또는

(<test> => <expression>) 

마지막 <clause> (else <expression1> <expresssion2> …) 일 수있다.

(cond (<test> <exp1> <exp2> …) 
     … 
     (else <exp1> <exp2> …)) 

당신이 당신의 표현으로이 일치하는 경우 : 따라서, => 사건을 무시하는 cond 표현처럼 보인다 empty?, 식별자하는 <test> 것을 볼

(cond (empty? 3) 
     (square 7) 
     (else 9)) 

하는 것입니다 항상 empty?이 거짓이면 true 여야합니다. 식별자 square은 또 다른 <test>입니다. 그건 당신이 의도 한 것이 아닙니다.