;(plt scheme 의 개발환경 DrScheme에서 language를 standard(R5RS)로 맞춘후 테스트)
; lambda로 만들어진 프로시져를리턴해주는데
; local state를 가진다
; 메세지 패싱방식
(define (make-queue)
(define (msg-error msg)
(display "unknown : ") (display msg) (newline))
(let ((ls '()))
(define (front)
(if (queue-empty?) '()
(car ls)))
(define (rear)
(if (queue-empty?) '()
(cdr ls)))
(define (queue-empty?) (null? ls))
(define (put! args)
(set! ls (append ls (cons (car args) '()))))
(define (get!)
(if (queue-empty?) '()
(let ((key (front)))
(set! ls (cdr ls))
key)))
(define (print-queue)
(if (queue-empty?) (display "empty")
(display ls))
(newline))
(lambda (msg . args)
(cond ((eq? msg 'queue-empty?) (queue-empty?))
((eq? msg 'front) (front))
((eq? msg 'rear) (rear))
((eq? msg 'put!) (put! args))
((eq? msg 'get!) (get!))
((eq? msg 'print-queue) (print-queue))
(else (msg-error msg))))))
(define q (make-queue))
(q 'put! 'a)
(q 'put! 'b)
(q 'print-queue)
(q 'get!)
(q 'print-queue)
(q 'put! 'c)
(q 'put! 'd)
(q 'print-queue)
(q 'get!)
(q 'get!)
(q 'get!)
(q 'get!)
(q 'print-queue)
; lambda로 만들어진 프로시져를리턴해주는데
; local state를 가진다
; 메세지 패싱방식
(define (make-queue)
(define (msg-error msg)
(display "unknown : ") (display msg) (newline))
(let ((ls '()))
(define (front)
(if (queue-empty?) '()
(car ls)))
(define (rear)
(if (queue-empty?) '()
(cdr ls)))
(define (queue-empty?) (null? ls))
(define (put! args)
(set! ls (append ls (cons (car args) '()))))
(define (get!)
(if (queue-empty?) '()
(let ((key (front)))
(set! ls (cdr ls))
key)))
(define (print-queue)
(if (queue-empty?) (display "empty")
(display ls))
(newline))
(lambda (msg . args)
(cond ((eq? msg 'queue-empty?) (queue-empty?))
((eq? msg 'front) (front))
((eq? msg 'rear) (rear))
((eq? msg 'put!) (put! args))
((eq? msg 'get!) (get!))
((eq? msg 'print-queue) (print-queue))
(else (msg-error msg))))))
(define q (make-queue))
(q 'put! 'a)
(q 'put! 'b)
(q 'print-queue)
(q 'get!)
(q 'print-queue)
(q 'put! 'c)
(q 'put! 'd)
(q 'print-queue)
(q 'get!)
(q 'get!)
(q 'get!)
(q 'get!)
(q 'print-queue)

