43 lines
1.1 KiB
Common Lisp
43 lines
1.1 KiB
Common Lisp
;;;; cl-scopes/core/message
|
|
|
|
(defpackage :scopes/core/message
|
|
(:use :common-lisp)
|
|
(:local-nicknames (:core :scopes/core))
|
|
(:export #:message #:simple-message
|
|
#:head #:data #:head-as-list))
|
|
|
|
(in-package :scopes/core/message)
|
|
|
|
(defgeneric as-list (obj))
|
|
|
|
;;;; message-head
|
|
|
|
(defclass message-head ()
|
|
((domain)
|
|
(action)
|
|
(class)
|
|
(item)))
|
|
|
|
;;;; message
|
|
|
|
(defclass message ()
|
|
((head :reader head :initarg :head)
|
|
(sender)
|
|
(timestamp)
|
|
(data :accessor data :initarg :data :initform nil)))
|
|
|
|
(defun simple-message (head-vals &optional data)
|
|
(let ((h (make-instance 'message-head)))
|
|
(dolist (sl '(domain action class item))
|
|
(setf (slot-value h sl) (pop head-vals)))
|
|
(make-instance 'message :head h :data data)))
|
|
|
|
(defmethod head-as-list ((msg message))
|
|
(with-slots (domain action class item) (head msg)
|
|
(list domain action class item)))
|
|
|
|
(defmethod print-object ((msg message) stream)
|
|
(with-slots (domain action class item) (head msg)
|
|
(format stream
|
|
"<message (~a ~a ~a ~a) <data ~s>>"
|
|
domain action class item (data msg))))
|