逆ポーランド電卓
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