'자료구조'에 해당되는 글 2건

  1. 2007/12/28 스킴 걸음마의 코드 - 큐 (queue) by sloth_chord
  2. 2007/12/28 스킴 걸음마의 코드 - 스택 (stack) by sloth_chord
;(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)


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
;(plt scheme 의 개발환경 DrScheme에서 language를 standard(R5RS)로 맞춘후 테스트)

; lambda로 만들어진 프로시져를리턴해주는데

; local state를 가진다


; lambda에서는 msg에따라서
; 적절한 프로시져를 호출해주는것임
; 메세지 패싱방식


(define (make-stack)
  (let ((ls '()))

    (define (empty?) (null? ls))

    (define (top)
      (if (empty?) '()
          (car ls)))

    (define (push! args)
      (set! ls (cons (car args) ls)))

    (define (pop!)
      (let ((key (top)))
        (if (not (empty?)) (set! ls (cdr ls)))
        key))


    (define (print-stack)
      (if (empty?) (display "empty")
          (display ls))
      (newline))

    (define (error-msg msg)
      (display "unknown ") (display msg) (newline))


    (lambda (msg . args)
      (cond ((eq? msg 'empty?) (empty?))
            ((eq? msg 'top) (top))
            ((eq? msg 'push!) (push! args))
            ((eq? msg 'pop!) (pop!))
            ((eq? msg 'print-stack) (print-stack))
            (else (error-msg msg))))))


(define s (make-stack))

(s 'push! 'a)
(s 'push! 'b)
(s 'push! 'c)
(s 'push! 'd)

(s 'print-stack)

(s 'pop! s)
(s 'pop! s)
(s 'pop! s)
(s 'pop! s)
(s 'pop! s)

(s 'print-stack)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord