2018.6.7 掲載分のプログラムがバグってました。C# に移植していて気が付いた。
除算のときの divisor の値はカッコ付き式(リスト)の場合もあるので、ゼロチェックの前に数値チェックが要ります。
バグっていた analyze-rpn のみ再掲載します。
(define (analyze-rpn rpn) (define (iter r) (if (null? r) (pop) (let ((e (car r))) (cond ((eq? e '+) (let ((addend (pop))) (push (sort-rpn (pop) e addend)))) ((eq? e '-) (let ((subtrahend (pop))) (push (list (pop) e subtrahend)))) ((eq? e '*) (let ((multiplier (pop))) (push (sort-rpn (pop) e multiplier)))) ((eq? e '/) (let ((divisor (pop))) (if (and (number? divisor) (= divisor 0)) (error "attempt to calculate a division by zero") (push (list (pop) e divisor))))) (else (push e))) (iter (cdr r))))) (init-stack) (guard (e ((<error> e) nil)) (iter rpn)))