2009-06-10 5 views
0

n 차원 벡터에 액세스하려고하지만 어떻게 든 (empty? '()) false를 계속 반환합니다.N 차원 벡터에 액세스하려하지만 무한 재귀가 발생했습니다.

; n 차원 벡터에 액세스
;; (access-nd 벡터 a-list of numbers) -> 요소
;; (액세스 ND (벡터 (벡터 y)는 'A', B) 'X') 0 1) -> X

(define (access-nd avector . alist) 
    (cond 
    ((and (not(empty? alist)) (vector? avector)) 
    (vector-ref (access-nd avector (rest alist)) (first alist))) 
    (else avector))) 

은 도와주세요.

편집 : 시정 CODE 대부분의 경우

(define (access-nd avector . alist) 
    (cond 
    ((and (not(empty? alist)) (vector? avector)) 
    (apply access-nd (vector-ref avector (first alist)) (rest alist))) 
    (else avector))) 

답변

2

, 한 줄은 읽어야 : "적용"없이

 (vector-ref (apply access-nd avector (rest alist)) (first alist))) 

alist은 비어하지 않습니다. 이유는 다음과 같습니다.

access-nd의 정의에서 alist 매개 변수는 선택적 매개 변수 목록입니다. 정상적인 위치 매개 변수와 점으로 구분됩니다. 즉, 1-n 매개 변수로 access-nd을 호출 할 수 있습니다. 첫 번째 매개 변수 뒤에 오는 매개 변수는 모두 목록에 수집되고 alist에 바인딩됩니다. 예를 들어,

(access-nd v 1 2 3) 

같은 호출 alist가 목록 (1 2 3)에 바인딩하게됩니다. 마찬가지로, 원래 코드에서이 호출은 :

(access-nd avector (rest alist)) 

alist가 하나 개의 요소로 목록에 바인딩하게됩니다. 그렇기 때문에 alist은 절대로 비어 있지 않습니다.

반면에 Scheme의 apply은 인수 목록을 마지막 매개 변수로 사용하여 정상적인 방법으로 전달 된 것처럼 함수를 호출합니다.

+0

왜 그런지 말해 줄 수 있습니까? – unj2

+0

무슨 일이 일어나고 있는지 충분히 이해했으면 좋겠다. –