aboutsummaryrefslogtreecommitdiff
path: root/semestr-2/racket/lista6/zad11/solution.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'semestr-2/racket/lista6/zad11/solution.rkt')
-rw-r--r--semestr-2/racket/lista6/zad11/solution.rkt58
1 files changed, 58 insertions, 0 deletions
diff --git a/semestr-2/racket/lista6/zad11/solution.rkt b/semestr-2/racket/lista6/zad11/solution.rkt
new file mode 100644
index 0000000..a44afe4
--- /dev/null
+++ b/semestr-2/racket/lista6/zad11/solution.rkt
@@ -0,0 +1,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 \ No newline at end of file