Advertisement
AlexPiskunov

Untitled

Dec 4th, 2018
796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 5.48 KB | None | 0 0
  1. (define (executor x stack)
  2.   (cond ((equal? x '+)
  3.          (cons (+ (car stack) (cadr stack)) (cddr stack)))
  4.         ((equal? x '-)
  5.          (cons (- (cadr stack) (car stack)) (cddr stack)))
  6.         ((equal? x '*)
  7.          (cons (* (cadr stack) (car stack)) (cddr stack)))
  8.         ((equal? x '/)
  9.          (cons (quotient (cadr stack) (car stack)) (cddr stack)))
  10.         ((equal? x 'mod)
  11.          (cons (remainder (cadr stack) (car stack)) (cddr stack)))
  12.         ((equal? x 'neg)
  13.          (cons (-(car stack)) (cdr stack)))
  14.         ((equal? x '=)
  15.          (if (= (cadr stack) (car stack))
  16.              (cons -1 (cddr stack))
  17.              (cons 0 (cddr stack))))
  18.         ((equal? x '<)
  19.          (if (< (cadr stack) (car stack))
  20.              (cons -1 (cddr stack))
  21.              (cons 0 (cddr stack))))
  22.         ((equal? x '>)
  23.          (if (> (cadr stack) (car stack))
  24.              (cons -1 (cddr stack))
  25.              (cons 0 (cddr stack))))
  26.         ((equal? x 'not)
  27.          (if (= (car stack) -1)
  28.              (cons 0 (cdr stack))
  29.              (cons -1 (cdr stack))))
  30.         ((equal? x 'and)
  31.          (if (and (= -1 (cadr stack) (= -1 (car stack))))
  32.              (cons -1 (cddr stack))
  33.              (cons 0 (cddr stack))))
  34.         ((equal? x 'or)
  35.          (if (or (= -1 (cadr stack) (= -1 (car stack))))
  36.              (cons -1 (cddr stack))
  37.              (cons 0 (cddr stack))))
  38.         ((equal? x 'drop)
  39.          (cdr stack))
  40.         ((equal? x 'swap)
  41.          (cons (cadr stack) (cons (car stack) (cddr stack))))
  42.         ((equal? x 'dup)
  43.          (cons (car stack) stack))
  44.         ((equal? x 'over)
  45.          (cons (cadr stack) stack))
  46.         ((equal? x 'rot)
  47.          (cons (caddr stack) (cons (cadr stack) (cons (car stack) (cdddr stack)))))
  48.         ((equal? x 'depth)
  49.          (cons (length stack) stack))
  50.         (else #f)))
  51.  
  52. (define (def x c aslist)
  53.   (cons (cons x (+ c 2)) aslist))
  54.  
  55. (define (struct x c v r s)
  56.   (cond ((equal? x 'define)
  57.          (if (equal? (vector-ref v c) 'end)
  58.              (+ c 1)
  59.              (struct x (+ c 1) v r s)))
  60.         ((equal? x 'end)
  61.          (+ (car r) 1))
  62.         ((equal? x 'if)
  63.          (if (= (car s) 0)
  64.              (if (equal? (vector-ref v c) 'endif)
  65.                  (+ c 1)
  66.                  (struct x (+ c 1) v r s))
  67.              (+ c 1)))
  68.         ((equal? x 'endif)
  69.          (+ c 1))
  70.         ((equal? x 'exit)
  71.          (+ (car r) 1))
  72.         (else #f)))
  73.  
  74.  
  75.  
  76.  
  77. (define (interpret vprog stack)
  78.   (define (iter stack c rstack aslist)
  79.     (cond
  80.       ((= (vector-length vprog) c)
  81.        stack)
  82.       ((equal? (vector-ref vprog c) 'define)
  83.        (iter stack (struct (vector-ref vprog c) c vprog rstack stack) rstack (def (vector-ref vprog (+ c 1)) c aslist)))
  84.       ((equal? (vector-ref vprog c) 'end)
  85.        (iter stack (struct (vector-ref vprog c) c vprog rstack stack) (cdr rstack) aslist))
  86.       ((equal? (vector-ref vprog c) 'exit)
  87.        (iter stack (struct (vector-ref vprog c) c vprog rstack stack) (cdr rstack) aslist))
  88.       ((equal? (vector-ref vprog c) 'if)
  89.        (iter (cdr stack) (struct 'if c vprog rstack stack) rstack aslist))
  90.       ((= (vector-length vprog) c) stack)
  91.       ((integer? (vector-ref vprog c))
  92.        (iter (cons (vector-ref vprog c) stack) (+ c 1) rstack aslist))
  93.       ((struct (vector-ref vprog c) c vprog rstack rstack)
  94.        (iter stack (struct (vector-ref vprog c) c vprog rstack stack) rstack aslist))
  95.       ((executor (vector-ref vprog c) stack)
  96.        (iter (executor (vector-ref vprog c) stack) (+ c 1) rstack aslist))
  97.       ((assq (vector-ref vprog c) aslist)
  98.        (iter stack (cdr (assq (vector-ref vprog c) aslist)) (cons c rstack) aslist))))
  99.   (iter stack 0 '() '()))
  100.  
  101.  
  102. (interpret #( define abs
  103.                dup 0 <
  104.                if neg endif
  105.                end
  106.                9 abs
  107.                -9 abs ) (quote ()))
  108. ;(9 9)
  109.  
  110. (interpret #( define =0? dup 0 = end
  111.                define <0? dup 0 < end
  112.                define signum
  113.                =0? if exit endif
  114.                <0? if drop -1 exit endif
  115.                drop
  116.                1
  117.                end
  118.                0 signum
  119.                -5 signum
  120.                10 signum ) (quote ()))
  121. ;(1 -1 0)
  122.  
  123. (interpret #( define1 - end
  124.                define =0? dup 0 = end
  125.                define =1? dup 1 = end
  126.                define factorial
  127.                =0? if drop 1 exit endif
  128.                =1? if drop 1 exit endif
  129.                dup —
  130.                factorial
  131.                *
  132.                end
  133.                0 factorial
  134.                1 factorial
  135.                2 factorial
  136.                3 factorial
  137.                4 factorial
  138.                ) (quote ()))
  139. ;(24 6 2 1 1)
  140.  
  141. (interpret #( define =0? dup 0 = end
  142.                define gcd
  143.                =0? if drop exit endif
  144.                swap over mod
  145.                gcd
  146.                end
  147.                90 99 gcd
  148.                234 8100 gcd ) '())
  149. ;(18 9)
  150.  
  151. (interpret #( define =0? dup 0 = end
  152.                define =1? dup 1 = end
  153.                define1 - end
  154.                define fib
  155.                =0? if drop 0 exit endif
  156.                =1? if drop 1 exit endif
  157.                — dup
  158.                — fib
  159.                swap fib
  160.                +
  161.                end
  162.                define make-fib
  163.                dup 0 < if drop exit endif
  164.                dup fib
  165.                swap —
  166.                make-fib
  167.                end
  168.                10 make-fib ) (quote ()))
  169. ;(0 1 1 2 3 5 8 13 21 34 55)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement