36 lines
1.0 KiB
Plaintext
36 lines
1.0 KiB
Plaintext
;; put info string in permanent storage for later use
|
|
(info 'make-Q
|
|
"usage: (define q (make-Q)) ; (q '[top | empty? | pop | push value | to-list | from-list list])")
|
|
|
|
;; make-Q
|
|
(define (make-Q)
|
|
(let ((q (make-vector 0)))
|
|
(lambda (message . args)
|
|
(case message
|
|
((empty?) (vector-empty? q))
|
|
((top) (if (vector-empty? q) (error 'Q:top:empty q) (vector-ref q 0)))
|
|
((push) (vector-push q (car args)))
|
|
((pop) (if (vector-empty? q) (error 'Q:pop:empty q) (vector-shift q)))
|
|
((to-list) (vector->list q))
|
|
((from-list) (set! q (list->vector (car args))) q )
|
|
(else (info 'make-Q) (error "Q:bad message:" message )))))) ; display info if unknown message
|
|
|
|
;;
|
|
(define q (make-Q))
|
|
(q 'empty?) → #t
|
|
(q 'push 'first) → first
|
|
(q 'push 'second) → second
|
|
(q 'pop) → first
|
|
(q 'pop) → second
|
|
(q 'top)
|
|
"💬 error: Q:top:empty #()"
|
|
(q 'from-list '( 6 7 8)) → #( 6 7 8)
|
|
(q 'top) → 6
|
|
(q 'pop) → 6
|
|
(q 'to-list)→ (7 8)
|
|
(q 'delete)
|
|
"💭 error: Q:bad message: delete"
|
|
|
|
;; save make-Q
|
|
(local-put 'make-Q)
|