aboutsummaryrefslogtreecommitdiff
path: root/semestr-2/racket/lista6/solution.rkt
blob: 59bdecd73b26d9334739070ec507e78b16e48698 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#lang racket

(provide (struct-out complex) parse eval)

(struct complex (re im) #:transparent)

(define value?
  complex?)

(define (comp-plus x y)
  (let ((x-re (complex-re x))
        (x-im (complex-im x))
        (y-re (complex-re y))
        (y-im (complex-im y)))
    (complex (+ x-re y-re) (+ x-im y-im))))

(define (comp-minus x y)
  (let ((x-re (complex-re x))
        (x-im (complex-im x))
        (y-re (complex-re y))
        (y-im (complex-im y)))
    (complex (- x-re y-re) (- x-im y-im))))

(define (comp-mult x y)
  (let ((x-re (complex-re x))
        (x-im (complex-im x))
        (y-re (complex-re y))
        (y-im (complex-im y)))
    (complex (- (* x-re y-re) (* x-im y-im)) (+ (* x-re y-im) (* x-im y-re)))))

(define (comp-mod2 x)
  (let ((x-re (complex-re x))
        (x-im (complex-im x)))
    (complex (+ (* x-re x-re) (* x-im x-im)) 0)))

(define (comp-mod x)
  (let ((mod2 (comp-mod2 x))
        (x-re (complex-re x)))
    (complex (sqrt x-re) 0)))

(define (comp-div x y)
  (let* ((mod2 (complex-re (comp-mod2 y)))
        (x-re (complex-re x))
        (x-im (complex-im x))
        (y-re (complex-re y))
        (y-im (complex-im y))
        (real (+ (* x-re y-re) (* x-im y-im)))
        (imag (- (* x-im y-re) (* x-re y-im))))
    (complex (/ real mod2) (/ imag mod2))))
  

;; Ponizej znajduje sie interpreter zwyklych wyrazen arytmetycznych.
;; Zadanie to zmodyfikowac go tak, by dzialal z liczbami zespolonymi.

(struct const (val)    #:transparent)
(struct binop (op l r) #:transparent)

(define (imaginary-unit? c)
  (eq? c 'i))

(define (op->proc op)
  (match op ['+ comp-plus] ['- comp-minus] ['* comp-mult] ['/ comp-div]))

(define (eval e)
  (match e
    [(const n) n]
    [(binop op l r) ((op->proc op) (eval l) (eval r))]))

(define (parse q)
  (cond [(number? q) (const (complex q 0))]
        [(imaginary-unit? q) (const (complex 0 1))]
        [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
         (binop (first q) (parse (second q)) (parse (third q)))]))