Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.65 KB | None | 0 0
  1. (define my-eval '(let (first (lambda (a) (car a))) ;;dodatkowe selektory do list do ulatwienia
  2.                    (let (second (lambda (a) (car (cdr a))))
  3.                      (let (third (lambda (a) (car (cdr (cdr a)))))
  4.                        (let (length (lambda (a) (let (iter (lambda-rec (iterr lis counter)
  5.                                                                        (if (null? lis)
  6.                                                                            counter
  7.                                                                             (iterr (cdr lis) (+ counter 1)))))
  8.                                                   (iter a 0))))
  9.                        (let (arith-expr? (lambda (a) ;;predykat sprawdza czy to wyrazenie arytmetyczne
  10.                                            (if (list? a)
  11.                                                (if (= (length a) 3)
  12.                                                    (if (eq? (first a) (quote +))
  13.                                                       true
  14.                                                        (if (eq? (first a) (quote -))
  15.                                                           true
  16.                                                            (if (eq? (first a) (quote *))
  17.                                                               true
  18.                                                                (if (eq? (first a) (quote /))
  19.                                                                   true
  20.                                                                   false))))
  21.                                                   false)
  22.                                               false)))
  23.                          (let (arith-op (lambda (a) (first a))) ;;selektor operatora
  24.                            (let (arith-left-arg (lambda (a) (second a))) ;;selektor pierwszego arg
  25.                              (let (arith-right-arg (lambda (a) (third a))) ;;selektor drugiego arg
  26.                                (let (eval ;;ewaluator
  27.                                      (lambda-rec (eval-help expr)
  28.                                                  (cond                  
  29.                                                    [(arith-expr? expr) (cond ;;jesli wyrazenie arytemetyczne to
  30.                                                                          ;;aplikuje odpowiednia procedure do
  31.                                                                          ;;zewaluowanych argumentow
  32.                                                                          [(eq? (arith-op expr) (quote +))
  33.                                                                           (+ (eval-help (arith-left-arg expr))
  34.                                                                              (eval-help (arith-right-arg expr)))]
  35.                                                                          [(eq? (arith-op expr) (quote -))
  36.                                                                           (- (eval-help (arith-left-arg expr))
  37.                                                                              (eval-help (arith-right-arg expr)))]
  38.                                                                          [(eq? (arith-op expr) (quote *))
  39.                                                                           (* (eval-help (arith-left-arg expr))
  40.                                                                              (eval-help (arith-right-arg expr)))]
  41.                                                                          [(eq? (arith-op expr) (quote /))
  42.                                                                           (/ (eval-help (arith-left-arg expr))
  43.                                                                              (eval-help (arith-right-arg expr)))])]
  44.                                                    [true expr] ;; jesli cos nie jest arith-expr to jest liczba
  45.                                                    )))
  46.                                  ;;TEST (* (+ (/ 4 2) (* 8 (+ 1 1))) (- 8 (+ 2 2)))
  47.                                  (eval (list (quote *) ;; 18*4 = 72
  48.                                               (list (quote +) ;; 2+16 = 18
  49.                                                            (list (quote /) 4 2) ;; 4/2 = 2
  50.                                                            (list (quote *) 8 ;;  8*2 = 16
  51.                                                                  (list (quote +) 1 1))) ;; 1+1= 2
  52.                                                     (list (quote -) 8 ;; 8 - 4 = 4
  53.                                                           (list (quote +) 2 2)))) ;; 2+ 2 =4
  54.                                  ))))))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement