aboutsummaryrefslogtreecommitdiff
path: root/semestr-2/racket/lista6/zad11/solution.rkt
blob: a44afe4f58a747f04acb39c41c6fa8c1af817d34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#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