Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #lang racket
- (require sicp)
- (define (top r) (r 'top))
- (define (make-ring . l)
- (let ([top-ptr '()] [back-ptr '()] [dispatch #f])
- (define (insert-back! x)
- (let ([new-ptr (cons (cons x '()) '())])
- (case top-ptr
- ('() (set! top-ptr new-ptr)
- (set! back-ptr new-ptr))
- (else (set-cdr! (car new-ptr) back-ptr)
- (set-cdr! back-ptr new-ptr)
- (set! back-ptr new-ptr)))))
- (define (init! l)
- (if (null? l)
- (begin (set-cdr! back-ptr top-ptr)
- (set-cdr! (car top-ptr) back-ptr))
- (begin (insert-back! (car l))
- (init! (cdr l)))))
- (init! l)
- (define (make-dispatch t b)
- (let ([top-ptr t] [back-ptr b] [disp #f])
- (define (rotation-left)
- (make-dispatch (cdr top-ptr) back-ptr))
- (define (rotation-right)
- (make-dispatch (cdar top-ptr) back-ptr))
- (define (rotation-right!)
- (set! top-ptr (cdar top-ptr))
- disp)
- (define (rotation-left!)
- (set! top-ptr (cdr top-ptr))
- disp)
- (define (dispatch m . v)
- (case m
- ['top-ptr top-ptr]
- ['back-ptr back-ptr]
- ['top (caar top-ptr)]
- ['rotation-left (rotation-left)]
- ['rotation-right (rotation-right)]
- ['rotation-right! (rotation-right!)])
- )
- (set! disp dispatch)
- disp))
- (make-dispatch top-ptr back-ptr)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement