算术表达式解析
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
我想将算术表达式解析为表示为(列表左右值)的二叉树。这是我的代码:
(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