fork download
  1. #lang racket
  2.  
  3. (define (calc-rpn text)
  4. (let ((table (hash "+" + "-" - "*" * "/" / "%" modulo)))
  5. (car
  6. (foldl (lambda (tok stack)
  7. (when (non-empty-string? tok)
  8. (cond ((string->number tok) => (lambda (x)
  9. (cons x stack)))
  10. (else (let ((b (car stack)) (a (cadr stack)))
  11. (cons ((hash-ref table tok) a b) (cddr stack)))))))
  12. '() (string-split text)))))
  13.  
  14. (define (main)
  15. (printf ">>> ")
  16. (let ((expr (read-line)))
  17. (with-handlers ((exn:fail:contract?
  18. (lambda (exn)
  19. (printf "不正な入力です~%")
  20. (main))))
  21. (unless (char=? (string-ref expr 0) #\q)
  22. (printf "~a = ~a~%" expr (calc-rpn expr))
  23. (main)))))
  24.  
  25.  
Success #stdin #stdout 0.66s 89084KB
stdin
Standard input is empty
stdout
Standard output is empty