逆ポーランド電卓

Schemeのお勉強のため、Gauche逆ポーランド電卓を書いてみました。が、あまりSchemeらしくないですね。むー。とはいえ、新しく言語を学ぶ際には、逆ポーランド電卓は適度な題材だと思います。
ファイル名: rpcalc.scm

#!/usr/bin/env gosh

(define (error mesg)
  (display mesg (current-error-port))
  (newline (current-error-port))
  (exit 1))

(define (main args)
  (let ((stack (list)))
    (for-each (lambda (arg) 
		(cond ((equal? "+" arg)
		       (let* ((op2 (pop! stack))
			      (op1 (pop! stack)))
			 (push! stack (+ op1 op2))))
		      ((equal? "-" arg)
		       (let* ((op2 (pop! stack))
			      (op1 (pop! stack)))
			 (push! stack (- op1 op2))))
		      ((equal? "*" arg)
		       (let* ((op2 (pop! stack))
			      (op1 (pop! stack)))
			 (push! stack (* op1 op2))))
		      ((equal? "/" arg)
		       (let* ((op2 (pop! stack))
			      (op1 (pop! stack)))
			 (if (eqv? op2 0)
			     (error "can't divid by 0."))
			 (push! stack (/ op1 op2))))
		      (else
		       (let ((n (string->number arg)))
			 (if (not (number? n))
			     (error "not number."))
			 (push! stack n)))))
	      (cdr args))
    (if (not (eqv? (length stack) 1))
	(error "illegal expression."))
    (display (pop! stack))
    (newline))
  0)

実行例: (2 * 3) * (4 + 5)

$ ./rpcalc.scm 2 3 '*' 4 5 + '*'
54