58 lines
1.6 KiB
Common Lisp
58 lines
1.6 KiB
Common Lisp
;;;; cl-scopes/csys/environ - communication system environment
|
|
|
|
(defpackage :scopes/csys/environ
|
|
(:use :common-lisp)
|
|
(:local-nicknames (:actor :scopes/core/actor)
|
|
(:csys :scopes/csys)
|
|
(:index :scopes/util/index)
|
|
(:message :scopes/core/message)
|
|
(:shape :scopes/shape)
|
|
(:util :scopes/util))
|
|
(:export #:create
|
|
#:actions
|
|
#:forward))
|
|
|
|
(in-package :scopes/csys/environ)
|
|
|
|
(defclass scope (csys:scope)
|
|
((cells :reader cells :initform (make-hash-table :test #'equal))))
|
|
|
|
(defun create (proc meta-env)
|
|
(let ((prg (csys:make-program proc)))
|
|
(csys:neuron (csys:scope prg meta-env :cls 'scope :categ '(:env :c00)))))
|
|
|
|
;;;; action handlers, public callables
|
|
|
|
(defun actions ()
|
|
(list :created #'cell-created
|
|
:default #'forward))
|
|
|
|
(defun cell-created (msg scope)
|
|
(let* ((data (shape:data msg))
|
|
(addr (getf data :addr)))
|
|
(when addr
|
|
(register-cell (cells scope) addr (getf data :new)))
|
|
msg))
|
|
|
|
(defun forward (msg scope)
|
|
(dolist (cell (find-cells (cells scope) (message:addr msg)))
|
|
(actor:send cell msg))
|
|
msg)
|
|
|
|
;;;; helpers
|
|
|
|
(defun register-cell (reg addr cell)
|
|
(destructuring-bind (dom cat key) addr
|
|
(let* ((dcat (list dom cat))
|
|
(idx (gethash dcat reg)))
|
|
(unless idx
|
|
(setf idx (index:create))
|
|
(setf (gethash dcat reg) idx))
|
|
(index:put idx key cell))))
|
|
|
|
(defun find-cells (reg addr)
|
|
(destructuring-bind (dom cat key) addr
|
|
(let ((idx (gethash (list dom cat) reg)))
|
|
(when idx
|
|
(index:query idx key)))))
|
|
|