Advertisement
Guest User

Untitled

a guest
Jul 8th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.45 KB | None | 0 0
  1. #lang racket
  2.  
  3. (require sicp)
  4.  
  5. (define (top r) (r 'top))
  6.  
  7. (define (make-ring . l)
  8. (let ([top-ptr '()] [back-ptr '()] [dispatch #f])
  9.  
  10.   (define (insert-back! x)
  11.     (let ([new-ptr (cons (cons x '()) '())])
  12.       (case top-ptr
  13.         ('() (set! top-ptr new-ptr)
  14.              (set! back-ptr new-ptr))
  15.         (else (set-cdr! (car new-ptr) back-ptr)
  16.               (set-cdr! back-ptr new-ptr)
  17.               (set! back-ptr new-ptr)))))
  18.  
  19.  
  20.   (define (init! l)
  21.     (if (null? l)
  22.         (begin (set-cdr! back-ptr top-ptr)
  23.                (set-cdr! (car top-ptr) back-ptr))
  24.         (begin (insert-back! (car l))
  25.                (init! (cdr l)))))
  26.   (init! l)
  27.  
  28.   (define (make-dispatch t b)
  29.     (let ([top-ptr t] [back-ptr b] [disp #f])
  30.       (define (rotation-left)
  31.         (make-dispatch (cdr top-ptr) back-ptr))
  32.  
  33.       (define (rotation-right)
  34.         (make-dispatch (cdar top-ptr) back-ptr))
  35.  
  36.       (define (rotation-right!)
  37.         (set! top-ptr (cdar top-ptr))
  38.         disp)
  39.  
  40.       (define (rotation-left!)
  41.         (set! top-ptr (cdr top-ptr))
  42.         disp)
  43.      
  44.       (define (dispatch m . v)
  45.         (case m
  46.           ['top-ptr top-ptr]
  47.           ['back-ptr back-ptr]
  48.           ['top (caar top-ptr)]
  49.           ['rotation-left (rotation-left)]
  50.           ['rotation-right (rotation-right)]
  51.           ['rotation-right! (rotation-right!)])
  52.         )
  53.       (set! disp dispatch)
  54.       disp))
  55.  
  56.  
  57.  
  58.   (make-dispatch top-ptr back-ptr)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement