;;;; 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 ">" domain action class item (data msg))))