Shammer's Philosophy

My private adversaria

LISP で Queue を実装 version 1.0

LISP で Queue を実装その2 - Shammerismを清書しただけ、という感じだが、ちょっとだけスリムになったのでとりあえず書いておくことにした。

(defclass queue ()
  ((internal-list :reader get-internal-list :writer set-internal-list :initform nil)))

(defmethod create-queue ()
  (make-instance 'queue))

(defmethod en-queue ((q queue) object)
  (let ((original-queue-list (get-internal-list q)))
    (set-internal-list (append original-queue-list (list object)) q)))

(defmethod de-queue ((q queue))
  (let ((original-queue-list (get-internal-list q))
	(return-object nil))
    (when (not (null original-queue-list))
      (setf return-object (car original-queue-list))
      (set-internal-list (cdr original-queue-list) q))
    return-object))

(unintern 'queue)

最後に unintern をするのは、(make-instance 'queue) をできなくするため。この状態でこれをすると以下のようなエラーになる。また、unintern していても create-queue は問題ない。

? (make-instance 'queue)
> Error: Class named QUEUE not found.
> While executing: FIND-CLASS, in process Listener(4).
> Type cmd-/ to continue, cmd-. to abort, cmd-\ for a list of available restarts.
> If continued: Try finding the class again
> Type :? for other options.
1 >q
? 
(defparameter z (create-queue))
Z
? (en-queue z 0)
(0)
? (de-queue z)
0
?

この queue を作成したい場合は、絶対に create-queue を使用しないといけない。別パッケージから使用させる場合、create-queue と en-queue と de-queue を export しておけばいい。