Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define-module consqueue
- (export make-queue queue? queue-empty?
- queue-push!
- queue-pop! queue-front list->queue))
- (select-module consqueue)
- (define-syntax apply-car!
- (syntax-rules ()
- ((_ pair fn) (set-car! pair (fn (car pair))))))
- (define-syntax apply-cdr!
- (syntax-rules ()
- ((_ pair fn) (set-cdr! pair (fn (cdr pair))))))
- (define (make-queue)
- '(() . ()))
- (define (queue? obj)
- (and (list? (car obj)) (list? (cdr obj))))
- (define (queue-empty? queue)
- (and (null? (car obj)) (null? (cdr obj))))
- (define (queue-push! queue obj)
- (apply-car queue (cut cons obj <>)))
- (define (queue-pop! que fallback)
- (cond
- ((queue-empty? que) fallback)
- ((null? (cdr que))
- (let1 reversed (reverse (car que))
- (set-car! que '())
- (set-cdr! que (cdr reversed))
- (values (car reversed) que)))
- (else
- (let1 obj (cadr que)
- (apply-cdr! que cdr)
- (values obj que)))))
- (define (queue-front queue fallback)
- (cond
- ((queue-empty? queue) fallback)
- ((null? (cdr queue))
- (let1 reversed (reverse (car queue))
- (set-car! queue '())
- (set-cdr! queue reversed)
- (cadr queue)))
- (else
- (cadr queue))))
- (define (list->queue lst)
- (cons lst '()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement