算术表达式解析

Arithmetic expression 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> *) +)

你错过了回避的基本情况(这里是 cond 形式的 else):

(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> 是 "falling through" cond 形式的结果(即没有条件匹配,也没有 else):

> (void? (cond))
#t