Advertisement
Guest User

prefix->list

a guest
Dec 9th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 2.72 KB | None | 0 0
  1. (define (prefix->list los)
  2.   (local
  3.     (
  4.      ;list-tail: (listof symbol/number) number -> (listof symbol(number)
  5.      ;Gib die Liste ab gegebenen Index wieder
  6.      (define (list-tail loa num)
  7.        (local
  8.          (
  9.           (define le (length loa))
  10.           ;list-tail: (listof symbol/number) number  (listof symbol/number) -> (listof symbol/number)
  11.           ;Gib die Liste ab gegebenen Index wieder
  12.           (define (list-tail loa num akk)
  13.             (cond
  14.               [(> num (sub1 le)) (error 'list-tail "index reaches a non-pair index")]
  15.               [(= num (sub1 le)) (if (empty? akk)
  16.                                      (list(list-ref loa num))
  17.                                      (append akk (list (list-ref loa num)) empty))]
  18.               [else (list-tail loa (add1 num) (append akk (list(list-ref loa num))))]
  19.               )
  20.             )
  21.           )
  22.          (list-tail loa num empty)
  23.          )
  24.        )
  25.      ;recursive-length: (listof number/symbol/list) -> number
  26.      ;Gib die rekursive Länge einer Liste an
  27.      (define (recursive-length ls)
  28.        (if (empty? ls)
  29.            0
  30.            (if (not (list? (first ls)))
  31.                (+ 1 (recursive-length (rest ls)))
  32.                (+ (recursive-length (first ls)) (recursive-length (rest ls))))))
  33.      (define operator (or (eq? (first los) '+)
  34.                           (eq? (first los) '-)
  35.                           (eq? (first los) '*)
  36.                           (eq? (first los) '/)))
  37.      ;dice: symbol -> boolean
  38.      ;Abfrage, ob es ein Würfel ist
  39.      (define (dice d) (or (eq? d 'w4)
  40.                           (eq? d 'w6)
  41.                           (eq? d 'w8)
  42.                           (eq? d 'w10)
  43.                           (eq? d 'w12)
  44.                           (eq? d 'w20)
  45.                           (eq? d 'w100)))
  46.      ;attribute: symbol -> boolean
  47.      ;Abfrage, ob es sich um ein Attribut handelt
  48.      (define (attribute a) (or (eq? a '%CO)
  49.                                (eq? a '%RE)
  50.                                (eq? a '%ST)
  51.                                (eq? a '%IN)
  52.                                (eq? a '%CH)))
  53.      )
  54.     (cond
  55.       [(or (number? (first los)) (dice (first los)) (attribute (first los))) (first los)]
  56.       [operator
  57.        (local
  58.          (
  59.           (define first-operator (prefix->list (rest los)))
  60.           (define second-operator
  61.             (if (or (number? first-operator)(dice first-operator)(attribute first-operator))
  62.                 (prefix->list (list-tail los 2))
  63.                 (prefix->list (list-tail los (+ 1 (recursive-length first-operator))))))
  64.           )
  65.          (list
  66.           (first los)
  67.           first-operator
  68.           second-operator))]
  69.       )
  70.     )
  71.   )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement