#lang racket (provide (struct-out const) (struct-out binop) rpn->arith) ;; ------------------------------- ;; Wyrazenia w odwr. not. polskiej ;; ------------------------------- (define (rpn-expr? e) (and (list? e) (pair? e) (andmap (lambda (x) (or (number? x) (member x '(+ - * /)))) e))) ;; ---------------------- ;; Wyrazenia arytmetyczne ;; ---------------------- (struct const (val) #:transparent) (struct binop (op l r) #:transparent) (define (arith-expr? e) (match e [(const n) (number? n)] [(binop op l r) (and (symbol? op) (arith-expr? l) (arith-expr? r))] [_ false])) ;; ---------- ;; Kompilacja ;; ---------- (struct stack (xs)) (define empty-stack (stack null)) (define (empty-stack? s) (null? (stack-xs s))) (define (top s) (car (stack-xs s))) (define (push a s) (stack (cons a (stack-xs s)))) (define (pop s) (stack (cdr (stack-xs s)))) (define (op->proc op) (match op ['+ +] ['- -] ['* *] ['/ /])) (define (eval-am e s) (cond [(null? e) (top s)] [(number? (car e)) (eval-am (cdr e) (push (const (car e)) s))] [(symbol? (car e)) (eval-am (cdr e) (push (binop (car e) (top (pop s)) (top s)) (pop (pop s))))])) (define (rpn->arith e) (eval-am e empty-stack)) ; Mozesz tez dodac jakies procedury pomocnicze i testy