2013-06-01 1 views
1

질문 제목이 약간 혼란스러운 경우 사과드립니다. 어쩌면 당신이 그것을 읽고 나면 더 나은 타이틀을 제안 할 수 있습니다.Scheme : if 문에서 #t를 사용할 수 없습니다.

온라인 과정의 숙제 중 하나 인 mit-scheme에 반복 수식을 작성하여 1에서 주어진 숫자로 표시하십시오.

아래의 코드는 잘 작동 :

(define (count2-iter num) 
    (define (iter counter) 
     (cond ((> counter num) #t) 
       (else (display counter) 
       (iter (+ counter 1))))) 
    (iter 1)) 

출력 :

1 ]=> (load "count2-iter.scm") 

;Loading "count2-iter.scm"... done 
;Value: count2-iter 

1 ]=> (count2-iter 10) 
12345678910 
;Value: #t 

가 개인적으로 난 단지 cond 2 가지를 사용하여 좋아하지 않는 나는 이것에 대한 if을 사용하려고했습니다.

(define (count2-iter1 num) 
    (define (loop idx) 
     (if (> idx num) 
      #t 
      ((display idx) 
      (loop (+ idx 1))))) 
    (loop 1)) 

출력 : 왜이 ​​

1 ]=> (count2-iter1 5) 
5 
;The object #!unspecific is not applicable. 
;To continue, call RESTART with an option number: 
; (RESTART 2) => Specify a procedure to use in its place. 
; (RESTART 1) => Return to read-eval-print level 1. 

입니까? cond에서와 같은 방식으로 #t 평가해야하지 않습니까? 제가 Scheme에 대해 아직 익숙하지 않아서 설명을 정말 고맙게 생각합니다.

답변

4

대신을 시도해보십시오

(define (count2-iter1 num) 
    (define (loop idx) 
    (if (> idx num) 
     #t 
     (begin ; notice the difference! 
      (display idx) 
      (loop (+ idx 1))))) 
    (loop 1)) 

는 이유는 다음과 같습니다 당신이 if를 사용하는 경우, 하나의 필연적 인 부분에 표현하고, 다른 부분에 하나있을 수 있습니다. 둘 이상의 표현식이 필요한 경우이를 (begin ...)으로 묶어야합니다. (...) 사이의 표현식을 둘러싸고 있습니다.이 표현식은 함수 응용 프로그램에 괄호가 사용되었으므로 (이 경우 오류 메시지는 The object #!unspecific is not applicable입니다).

한편, cond은 조건이 충족 될 때 각 절에 대해 암시 적으로 begin입니다. 개인적으로, 저는 조건 다음에 하나 이상의 표현식이 필요할 때 cond을 사용하는 것을 선호합니다 - 그다지 상세하지 않습니다.

+0

+1하지만 개인적으로 나는 그 상태를 뒤집을 것이 훨씬 자연 스럽다고 생각합니다. 더 좋은 점은'when' 또는'unless' 형태로 else 브랜치가 없다면 말입니다. – djf

+0

감사합니다 ... 나는 몇 시간 전에 시작해서 cond를 쓰지 만 그곳에는 암시 적이라는 것을 결코 알지 못했습니다. –