Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.22 KB | None | 0 0
  1. (define-module consqueue
  2. (export make-queue queue? queue-empty?
  3. queue-push!
  4. queue-pop! queue-front list->queue))
  5.  
  6. (select-module consqueue)
  7.  
  8. (define-syntax apply-car!
  9. (syntax-rules ()
  10. ((_ pair fn) (set-car! pair (fn (car pair))))))
  11. (define-syntax apply-cdr!
  12. (syntax-rules ()
  13. ((_ pair fn) (set-cdr! pair (fn (cdr pair))))))
  14.  
  15. (define (make-queue)
  16. '(() . ()))
  17.  
  18. (define (queue? obj)
  19. (and (list? (car obj)) (list? (cdr obj))))
  20.  
  21. (define (queue-empty? queue)
  22. (and (null? (car obj)) (null? (cdr obj))))
  23.  
  24. (define (queue-push! queue obj)
  25. (apply-car queue (cut cons obj <>)))
  26.  
  27. (define (queue-pop! que fallback)
  28. (cond
  29. ((queue-empty? que) fallback)
  30. ((null? (cdr que))
  31. (let1 reversed (reverse (car que))
  32. (set-car! que '())
  33. (set-cdr! que (cdr reversed))
  34. (values (car reversed) que)))
  35. (else
  36. (let1 obj (cadr que)
  37. (apply-cdr! que cdr)
  38. (values obj que)))))
  39.  
  40. (define (queue-front queue fallback)
  41. (cond
  42. ((queue-empty? queue) fallback)
  43. ((null? (cdr queue))
  44. (let1 reversed (reverse (car queue))
  45. (set-car! queue '())
  46. (set-cdr! queue reversed)
  47. (cadr queue)))
  48. (else
  49. (cadr queue))))
  50.  
  51. (define (list->queue lst)
  52. (cons lst '()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement