チケットナンバー問題の回答の最適化 バグ修正のバグ修正

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