Hi, I'm trying to figure out how to design a chat-server using Cells. This doesn't work, but this is what I've come up with:
(defpackage CellsChat (:use :cl :cells)) (in-package :CellsChat)
(defparameter *newline* (princ-to-string #\Newline))
(defmodel CellsChat () ((username :cell nil :accessor username-of :initarg :username :initform (error "CellsChat needs a `username'."))
(text-box :accessor text-box-of :allocation :class :initform (c-in ""))
(participants :cell nil :accessor participants-of :allocation :class :initform nil)))
(defmethod initialize-instance :after ((chat CellsChat) &key) ;; New user joins the conversation. (push chat (participants-of chat)) ;; New user wants to see what's been going on recently. (updateTextBox chat))
(defmethod updateTextBox ((chat CellsChat)) ;; Show conversation till now. (format t "(text-box-of ~A): '~A'~%" (username-of chat) (text-box-of chat)))
(defobserver text-box ((chat CellsChat)) ;; Update interface of each participant whenever ;; `text-box' changes (for whatever reason). (dolist (participant (participants-of chat)) (updateTextBox participant)))
(defmethod say ((chat CellsChat) (what string)) (setf (text-box-of chat) (concatenate 'string (text-box-of chat) (username-of chat) ": " what *newline*)))
(defmethod part ((chat CellsChat)) ;; User leaves the conversation. (setf (participants-of chat) (delete chat (participants-of chat))))