2012-09-13 44 views
2

對於一般的Scheme和函數式語言,我是全新的。我正在嘗試創建一個二叉搜索樹。節點的格式是三個元素的列表,第一個是節點的值,第二個是左側子節點,第三個是右側子節點。我有一個「make」函數,它創建一個空樹:(()()())。我也有插入功能。下面是代碼:Scheme二叉搜索樹錯誤(R5RS)

;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)) 
) 

爲了測試它,我運行下面幾行:

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

然後我收到以下錯誤:

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

我已經檢查並重新檢查我的括號......並以調試模式運行它,我發現它在插入2到樹中的END時失敗。直到它,它按計劃運作。這是我的愚蠢語法/邏輯錯誤的原因嗎?

回答

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是括號敏感的。 –