Advertisement
Guest User

interpreter

a guest
Nov 27th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 5.36 KB | None | 0 0
  1. (define (evaluate expr xs)
  2.   (cond ((eq? expr '+) (+ (cadr xs) (car xs)))
  3.         ((eq? expr '-) (- (cadr xs) (car xs)))
  4.         ((eq? expr '*) (* (cadr xs) (car xs)))
  5.         ((eq? expr '/) (/ (cadr xs) (car xs)))
  6.         ((eq? expr 'mod) (remainder (cadr xs) (car xs)))
  7.         ((eq? expr 'neg) (- (car xs)))
  8.         ((eq? expr '=) (if (= (car xs) (cadr xs)) -1 0))
  9.         ((eq? expr '>) (if (> (cadr xs) (car xs)) -1 0))
  10.         ((eq? expr '<) (if (< (cadr xs) (car xs)) -1 0))
  11.         ((eq? expr 'not) (if (not (= (car xs) 0)) 0 -1))
  12.         ((eq? expr 'and) (if (and (not (= (car xs) 0)) (not (= (cadr xs) 0))) -1 0))
  13.         ((eq? expr 'or) (if (and (= (car xs) 0) (= (cadr xs) 0)) 0 -1))))
  14.  
  15. ;evaluation изменений стэка данных-->
  16. (define ev-list (list
  17.                  (list 'drop (lambda (x) (cdr x)))
  18.                  (list 'swap (lambda (x) (append (cons (cadr x) (cons (car x) '())) (cddr x))))
  19.                  (list 'dup (lambda (x) (if (not (null? x)) (cons (car x) x))))
  20.                  (list 'over (lambda (x) (cons (cadr x) x)))
  21.                  (list 'rot (lambda (x) (append (cons (caddr x) (cons (cadr x) (car x))) (cdddr x))))
  22.                  (list 'depth (lambda (x) (cons (length x) x)))))
  23.  
  24. (define (acons key x alist)
  25.   (cons (list key x) alist))
  26.  
  27. (define (search prg count x)
  28.   (if (equal? (vector-ref prg count) x)
  29.       (+ count 1)
  30.       (search prg (+ count 1) x)))
  31.  
  32. (define (endif-search prg wc if-count)
  33.   (cond ((eq? (vector-ref prg wc) 'if) (endif-search prg (+ wc 1) (+ if-count 1)))
  34.         ((and (<= if-count 0) (eq? (vector-ref prg wc) 'endif)) wc)
  35.         ((eq? (vector-ref prg wc) 'endif) (endif-search prg (+ wc 1) (- if-count 1)))
  36.         (else (endif-search prg (+ wc 1) if-count))))
  37.      
  38. ;(trace endif-search)
  39.  
  40. (define (interpret code stack)
  41.   (define (helper prg wc xs rs env) ;prg - код, xs - stack, rs - returnStack; env - список слов из define
  42.     (if (= wc (vector-length prg))
  43.         xs
  44.         (cond ((number? (vector-ref prg wc)) (helper prg (+ wc 1) (cons (vector-ref prg wc) xs) rs env))
  45.               ((eq? (vector-ref prg wc) '+) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  46.               ((eq? (vector-ref prg wc) '-) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  47.               ((eq? (vector-ref prg wc) '*) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  48.               ((eq? (vector-ref prg wc) '/) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  49.               ((eq? (vector-ref prg wc) 'mod) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  50.               ((eq? (vector-ref prg wc) 'neg) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs))) (cdr xs)) rs env))
  51.  
  52.               ((eq? (vector-ref prg wc) '=) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  53.               ((eq? (vector-ref prg wc) '>) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  54.               ((eq? (vector-ref prg wc) '<) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  55.  
  56.               ((eq? (vector-ref prg wc) 'not) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs))) (cdr xs)) rs env))
  57.               ((eq? (vector-ref prg wc) 'and) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  58.               ((eq? (vector-ref prg wc) 'or) (helper prg (+ wc 1) (cons (evaluate (vector-ref prg wc) (list (car xs) (cadr xs))) (cddr xs)) rs env))
  59.  
  60.               ((eq? (vector-ref prg wc) 'drop) (helper prg (+ wc 1) ((cadr (assoc 'drop ev-list)) xs) rs env))
  61.               ((eq? (vector-ref prg wc) 'swap) (helper prg (+ wc 1) ((cadr (assoc 'swap ev-list)) xs) rs env))
  62.               ((eq? (vector-ref prg wc) 'dup) (helper prg (+ wc 1) ((cadr (assoc 'dup ev-list)) xs) rs env))
  63.               ((eq? (vector-ref prg wc) 'over) (helper prg (+ wc 1) ((cadr (assoc 'over ev-list)) xs) rs env))
  64.               ((eq? (vector-ref prg wc) 'rot) (helper prg (+ wc 1) ((cadr (assoc 'rot ev-list)) xs) rs env))
  65.               ((eq? (vector-ref prg wc) 'depth) (helper prg (+ wc 1) ((cadr (assoc 'depth ev-list)) xs) rs env))
  66.               ;define - добавление word в список env
  67.               ((eq? (vector-ref prg wc) 'define) (helper prg (search prg wc 'end) xs rs (acons (vector-ref prg (+ wc 1)) (+ wc 2) env)))
  68.               ((eq? (vector-ref prg wc) 'end) (helper prg (car rs) xs (cdr rs) env))
  69.               ((eq? (vector-ref prg wc) 'exit) (helper prg (car rs) xs (cdr rs) env))
  70.               ((eq? (vector-ref prg wc) 'if) (if (= (car xs) -1) (helper prg (+ wc 1) (cdr xs) rs env) (helper prg (endif-search prg (+ wc 1) 0) (cdr xs) rs env)))
  71.               ((eq? (vector-ref prg wc) 'endif) (helper prg (+ wc 1) xs rs env))
  72.               ((number? (cadr (assoc (vector-ref prg wc) env))) (helper prg (cadr (assoc (vector-ref prg wc) env)) xs (cons (+ wc 1) rs) env)))))
  73.               ;((symbol? (cadr (assoc (vector-ref prg wc) env))) (helper prg (cadr (assoc (vector-ref prg wc) env)) xs (cons (+ 1 wc) rs) env)))))
  74.         ;(append xs stack)))
  75.   (helper code 0 '() '() ev-list))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement