21 lines
778 B
Common Lisp
21 lines
778 B
Common Lisp
(setf (symbol-function '^) #'expt) ; Make ^ an alias for EXPT
|
|
|
|
(defun print-stack (token stack)
|
|
(format T "~a: ~{~a ~}~%" token (reverse stack)))
|
|
|
|
(defun rpn (tokens &key stack verbose )
|
|
(cond
|
|
((and (not tokens) (not stack)) 0)
|
|
((not tokens) (car stack))
|
|
(T
|
|
(let* ((current (car tokens))
|
|
(next-stack (if (numberp current)
|
|
(cons current stack)
|
|
(let* ((arg2 (car stack))
|
|
(arg1 (cadr stack))
|
|
(fun (car tokens)))
|
|
(cons (funcall fun arg1 arg2) (cddr stack))))))
|
|
(when verbose
|
|
(print-stack current next-stack))
|
|
(rpn (cdr tokens) :stack next-stack :verbose verbose)))))
|