Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 2.09 KB | None | 0 0
  1. #lang racket
  2. (require test-engine/racket-tests)
  3. (provide in->pre)
  4. (define (valid e)
  5.   (match e
  6.     [`(,x + ,y ...) (and (valid x) (valid y))]
  7.     [`(,x * ,y ...) (and (valid x) (valid y))]
  8.     [x (or (symbol? x) (number? x)
  9.            (and (list? x) (= (length x) 1) (valid (car x))))]))
  10.  
  11. (define (in->pre-h s mr acc)
  12.   (cond
  13.     [(empty? s) (append acc `(,(append '(*) mr)))]
  14.     [(or (number? s) (symbol? s)) (append acc `(,(append '(*) (append mr `(,s)))))]
  15.     [(list? (car s)) (in->pre-h (cdr s) (append mr (list (in->pre (car s)))) acc)]
  16.     [(equal? (car s) '+) (in->pre-h (cdr s) '() (append acc `(,(append '(*) mr))))]
  17.     [(equal? (car s) '*) (in->pre-h (cdr s) mr acc)]
  18.     [(or (number? (car s)) (symbol? (car s))) (in->pre-h (cdr s) (append mr `(,(car s))) acc)]
  19.     [else (error "bad expression")]))
  20.  
  21. (define (remove-unnecessary s tl)
  22.   (cond
  23.     [(empty? s) '()]
  24.     [(number? s) s]
  25.     [(symbol? s) s]
  26.     [(and tl (list? s) (= (length s) 2)) (remove-unnecessary (cadr s) #t)]
  27.     [(list? (car s)) (cons (remove-unnecessary (car s) #t) (remove-unnecessary (cdr s) #f))]
  28.     [else (cons (car s) (remove-unnecessary (cdr s) #f))]))
  29.  
  30. (define (in->pre s)
  31.   (if (not (valid s))
  32.       (error "bad expression")
  33.       (remove-unnecessary `(+ ,@(in->pre-h s '() '())) #t)))
  34.  
  35. (define (read-to-list)
  36.   (define k (read))
  37.   (if (eof-object? k)
  38.       '()
  39.       (cons k (read-to-list))))
  40.  
  41. ;;(in->pre (read-to-list))
  42. ;; simple tests
  43. (check-expect (in->pre '(1 + 1)) '(+ 1 1))
  44. (check-expect (in->pre '(2 * 2)) '(* 2 2))
  45. (check-expect (in->pre '(2 * 2 + 2)) '(+ (* 2 2) 2))
  46. (check-expect (in->pre '(1 + 2 + 3 * 4 * 5 + 6 * 7)) '(+ 1 2 (* 3 4 5) (* 6 7)))
  47. (check-expect (in->pre '(1 + (2 + 3 + 4))) '(+ 1 (+ 2 3 4)))
  48. (check-expect (in->pre '((1 + (2 + 3 + 4)) * 5)) '(* (+ 1 (+ 2 3 4)) 5))
  49.  
  50. ;; annoying tests
  51. (check-expect (in->pre '(2 + ((2)))) '(+ 2 2))
  52. (check-expect (in->pre '(1 + ((2)) + x)) '(+ 1 2 x))
  53. (check-expect (in->pre 4) 4)
  54. (check-expect (in->pre 'x) 'x)
  55. (check-expect (in->pre '(x * (y + z))) '(* x (+ y z)))
  56. (check-expect (in->pre '(x * ((y + z)))) '(* x (+ y z)))
  57. (test)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement