2012-09-13 3 views
2

일반적으로 Scheme 및 기능 언어를 완전히 처음 접했습니다. 이진 검색 트리를 만들려고합니다. 노드의 형식은 세 요소의 목록입니다. 첫 번째 요소는 노드의 값이고 두 번째 요소는 왼쪽 자식 노드이고 세 번째 요소는 오른쪽 자식 노드입니다. 나는 빈 트리를 만드는 "make"함수를 가지고있다 : (()()()). 삽입 기능도 있습니다. 내가 확인하고있다Scheme 이진 검색 트리 오류 (R5RS)

application: not a procedure; 
expected a procedure that can be applied to arguments 
given: (2 (()()()) (()()())) 
arguments...: [none] 

다시 확인 :

> (define b1 (make)) 
> (define b2 (insert b1 1)) 
> b2 
(1 (()()()) (()()())) 
> (define b3 (insert b2 2)) 

난 후 다음과 같은 오류가 나타날 수

;Inserts a number into the tree 
(define (insert t x) 
    (cond ((null? (car t)) 
     (list x (make) (make))) 
     ((< x (car t)) 
     ((list (car t) ((insert (cadr t) x)) (caddr t)))) 
     ((> x (car t)) 
     ((list (car t) (cadr t) ((insert (caddr t) x))))) 

) 
) 

;Makes a new empty tree 
(define (make) 
    (list (list) (list) (list)) 
) 

내가 다음 줄을 실행을 테스트하려면 다음은 코드입니다 내 괄호 ... 그리고 디버그 모드에서 실행, 나는 그것이 나무에 2를 삽입하는 끝에서 실패 참조하십시오. 그 때까지, 그것은 계획대로 작동합니다. 이 부분이 어리석은 구문/논리 오류의 원인입니까?

답변

4
((list (car t) ((insert (cadr t) x)) (caddr t))) 

외부 괄호 쌍이 문제입니다. (list (car t) ((insert (cadr t) x)) (caddr t))에 목록이 있습니다. 다른 쌍의 괄호를 묶음으로써 함수를 마치 함수처럼 그 목록을 적용하려고합니다. 따라서 오류 메시지는 사용할 수 없습니다.

+2

정말 고마워요! 나는 그것이 내 멍청한 실수라고 생각했다. 매력처럼 일했습니다. 나는 "의심 스러울 때, 더 많은 괄호를 더한다"는 전체가 여기에 적용되지 않는다고 생각합니다. –

+2

@ Ryan Python이 들여 쓰기에 민감하고 Ruby가 공백에 민감한 것을 알고 있습니까? Lisp와 Scheme은 괄호에 민감합니다. –