2016-03-20 27 views
0

算術式を(リストの左の値)として表現されたバイナリツリーに解析します。これは私のコードです:算術式の解析parse

(define (parse exp) 
(let loop ([e exp]) 
    (cond 
    ((and (list? e) (or (not (null? (car e))) (not (null? (caddr e))))) 
     (list (loop (car e)) (loop (caddr e)) (cadr e)))))) 

(parse '(1 + (2 * 3))) 

結果はこれで、どこから空白が表示されるのですか?

'(#<void> (#<void> #<void> *) +) 

答えて

1

あなたは(ここではそれがcond形でelseです)recusionのベースケースを逃している:

(define (parse exp) 
    (let loop ([e exp]) 
    (cond 
     ((and (list? e) (or (not (null? (car e))) (not (null? (caddr e))))) 
     (list (loop (car e)) (loop (caddr e)) (cadr e))) 
     (else e)))) 

テスト:

> (parse '(1 + (2 * 3))) 
'(1 (2 3 *) +) 

#<void>は「落下の結果であり、 「condフォームを使用します(つまり、条件は一致せず、elseはありません)。

> (void? (cond)) 
#t 
関連する問題