41 lines
1.1 KiB
Common Lisp
41 lines
1.1 KiB
Common Lisp
;;;; cl-scopes/core/message
|
|
|
|
(defpackage :scopes/core/message
|
|
(:use :common-lisp)
|
|
(:export #:message #:create
|
|
#:head #:head-as-list
|
|
#:data #:sender))
|
|
|
|
(in-package :scopes/core/message)
|
|
|
|
;;;; message-head
|
|
|
|
(defclass message-head ()
|
|
((domain)
|
|
(action)
|
|
(class)
|
|
(item)))
|
|
|
|
;;;; message
|
|
|
|
(defclass message ()
|
|
((head :reader head :initarg :head)
|
|
(sender :reader sender :initarg :sender :initform nil)
|
|
(timestamp)
|
|
(data :accessor data :initarg :data :initform nil)))
|
|
|
|
(defun create (head-vals &key data sender)
|
|
(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 :sender sender)))
|
|
|
|
(defmethod print-object ((msg message) stream)
|
|
(with-slots (domain action class item) (head msg)
|
|
(format stream
|
|
"<message (~a ~a ~a ~a) ~s <data ~s>>"
|
|
domain action class item (sender msg) (data msg))))
|
|
|
|
(defun head-as-list (msg)
|
|
(with-slots (domain action class item) (head msg)
|
|
(list domain action class item)))
|