2017-12-13 3 views
0
여기

내가 (길이 n 균형 괄호의 모든 쌍을 표시합니다)r5rs : 거기에 어떤 아닙니다 절차 오류

(define (combine-list l r) 
(append l (cons r '()))) 

;(combine-list '(1 2 3) '(4 4)) 

(define(bps n) 
    (bps-iter '() (/ n 2) 0 0)) 


(define (bps-iter lst n open close) (;(display open) (display close) (display "\n") 
    (cond ((eq? n close) (display lst)) 
     (else ((if (> open close) 
         (bps-iter (combine-list lst 1) n open (+ 1 close))) 
       (if (< open n) 
         (bps-iter (combine-list lst 0) n (+ open 1) close))) 
     ) 
     ))) 

(bps 4) 

나온 코드 그리고

application: not a procedure; 
expected a procedure that can be applied to arguments 
    given: #<void> 
    arguments...: [none] 

로 밝혀졌다 문제가 종료 (eq? n close)하고 'else'로 돌아가서 다른 괄호 집합을 찾았습니까?

+0

너무 많은 괄호가 있기 때문에 거의 항상 그렇습니다. 너는 두 곳에서 너무 많아. – molbdnilo

답변

0

귀하의 문제 : 이것은이 구조가

((if (> open close) 
    (bps-iter (combine-list lst 1) n open (+ 1 close))) 
(if (< open n) 
    (bps-iter (combine-list lst 0) n (+ open 1) close))) 

:

((if predicate 
    consequence 
    'undefined) 
(if predicate2 
    consequence2 
    'undefined)) 

그리고 두 if 중 하나의 결과를 bps-iter 또는 일부 정의되지 않은 값의 결과입니다 .. 두 가지를 말할 수 있습니다 if-exp1과 if-expr2로 축약 될 수 있습니다.

(if-expr1 if-expr2) 

이렇게하면 predicate1이 참이 아니라면 함수처럼 undefined를 호출하려고 시도 할 것이고, 사실 경우 bts-iter이 적어도 함수를 리턴해야한다고 결론 내리는 것이 안전합니다. 이들 중 noe는 사실이므로 실패 할 운명입니다. 이러한 중첩 될 수 있습니다

(if predicate 
    consequence 
    alternative) ; optional in R6RS, turns into undefined 

: 경우

어떻게 사용할 수 있습니다.

+0

r5rs에서 둘 다 술어를 만나는 경우 두 개의 if 문을 모두 처리 할 수 ​​있습니까? 내가 그들을 중첩 시키려고하면 두 가지 모두를 트리거 할 수 없습니다. –

+0

@ZhiweiHuang'(expr1 ... exprn 시작)'은 C 언어에서'{...} '와 같습니다. 마지막 표현식을 제외하고는 모두 부작용만을위한 것이고 형태의 결과는'exprn'의 값입니다. 최상위 레벨에 중첩 될 필요가없는 표현식의 경우 'let'이 동일한 작업을 수행합니다. – Sylwester