トップ 最新 追記

Catra's Diary

2005|01|02|03|05|06|07|10|
2006|05|07|09|10|11|
2007|06|07|08|
2008|01|02|07|09|11|12|
2009|06|
2010|03|07|
2011|01|
2013|05|

2007-07-14 [Saturday]

_ 逆ポーランド記法(Scheme)

逆ポーランド記法が使えると便利だな、と この記事を読んだとき 思ったので、Scheme で書いてみた (Gauche で確認。arity があるので移植性は低い)。

(define (rpn . args)
  (let body ((stack '())
             (args args))
    (if (null? args)
        (car stack)
        (cond ((number? (car args))
               (body (cons (car args) stack) (cdr args)))
              ((equal? (arity (car args)) 1)
               (body (cons ((car args) (car stack)) (cdr stack)) (cdr args)))
              (else
               (body (cons ((car args) (cadr stack) (car stack)) (cddr stack)) (cdr args)))))))

; example.
(display (rpn 1 2 +))
(display "\n")
(display (rpn 1 2 + 3 4 + *))
(display "\n")
(display (rpn 16 2 - 10 2 / remainder))
(display "\n")
(display (rpn 3.141592 2.0 / sin))
(display "\n")

xyzzy とか Emacs の mini buffer で動くとなお良さそうだが、そこまではやっていない。


トップ 最新 追記