environ: cell registry: now a predefined property list named *spaces*

This commit is contained in:
Helmut Merz 2026-08-31 17:02:41 +02:00
parent e6a802a939
commit e6bccc140a
6 changed files with 43 additions and 42 deletions

View file

@ -154,7 +154,7 @@
(setf (value scope) (shape:data-value msg :value)) (setf (value scope) (shape:data-value msg :value))
(values msg scope))) (values msg scope)))
(defun value-add (&key (bias 0) (threshold 1) limits) (defun value-add (&key (bias 0) (threshold 1) (limits '(0 10)))
(lambda (msg scope) (lambda (msg scope)
(let* ((val (getf (shape:data msg) :value)) (let* ((val (getf (shape:data msg) :value))
(newval (+ val (value scope))) (newval (+ val (value scope)))

View file

@ -18,13 +18,14 @@
(defvar *env* nil) (defvar *env* nil)
(defclass scope (csys:scope) (defclass scope (csys:scope)
((cells :reader cells :initform (make-hash-table :test #'equal)))) ((spaces :reader spaces :initarg :spaces)))
(defun create (proc meta-env &key eff-contacts) (defun create (proc meta-env &key eff-contacts (spaces '(:env :csys)))
(let* ((prg (csys:make-program proc)) (let* ((prg (csys:make-program proc))
(scope (csys:scope prg meta-env :cls 'scope :categ '(:env :c00))) (spcs (loop for d in spaces append (list d (index:create))))
(scope (csys:scope prg meta-env :cls 'scope :categ '(:env :c00) :spaces spcs))
(env (csys:neuron scope))) (env (csys:neuron scope)))
(create-contact-cells eff-contacts env (cells scope)) (create-contact-cells eff-contacts env (spaces scope))
env)) env))
(defun simple-setup (cfg) (defun simple-setup (cfg)
@ -75,9 +76,9 @@
(addr (getf data :addr (getf data :categ))) (addr (getf data :addr (getf data :categ)))
(new (getf data :new))) (new (getf data :new)))
(when addr (when addr
(register-cell (cells scope) addr new)) (register-cell (spaces scope) addr new))
(let* ((ct-addr (cons :env (cdr addr))) (let* ((ct-addr (cons :env (cdr addr)))
(ct (find-cell (cells scope) ct-addr :no-warn t))) (ct (find-cell (spaces scope) ct-addr :no-warn t)))
(when ct (csys:send-connect new ct))) (when ct (csys:send-connect new ct)))
(csys:send-message new (list (message:domain msg) :next) data) (csys:send-message new (list (message:domain msg) :next) data)
nil)) nil))
@ -85,7 +86,7 @@
(defun forward (msg scope) (defun forward (msg scope)
(let ((addr (message:addr msg))) (let ((addr (message:addr msg)))
(if addr (if addr
(let ((cell (find-cell (cells scope) (message:addr msg)))) (let ((cell (find-cell (spaces scope) (message:addr msg))))
(actor:send cell msg)) (actor:send cell msg))
(let ((rcvr (getf (shape:data msg) :to))) (let ((rcvr (getf (shape:data msg) :to)))
(if rcvr (if rcvr
@ -97,7 +98,7 @@
(let* ((data (shape:data msg)) (let* ((data (shape:data msg))
(tgt (getf data :target))) (tgt (getf data :target)))
(when (listp tgt) (when (listp tgt)
(setf (getf data :target) (find-cell (cells scope) tgt))) (setf (getf data :target) (find-cell (spaces scope) tgt)))
(forward (message:create (shape:head msg) :data data) scope))) (forward (message:create (shape:head msg) :data data) scope)))
;;;; public shortcuts ;;;; public shortcuts
@ -122,18 +123,14 @@
;;;; internal helpers ;;;; internal helpers
(defun register-cell (reg addr cell) (defun register-cell (reg addr cell)
(destructuring-bind (dom cat &optional (key "")) addr (destructuring-bind (dom cat &optional (loc "")) addr
(let* ((categ (list dom cat)) (let ((idx (getf reg dom)))
(idx (gethash categ reg))) (index:put idx loc cell))))
(unless idx
(setf idx (index:create))
(setf (gethash categ reg) idx))
(index:put idx key cell))))
(defun find-cells (reg addr &key no-warn) (defun find-cells (reg addr &key no-warn)
(destructuring-bind (dom cat &optional (key "")) addr (destructuring-bind (dom cat &optional (loc "")) addr
(let* ((idx (gethash (list dom cat) reg)) (let* ((idx (getf reg dom))
(cells (when idx (index:query idx key)))) (cells (when idx (index:query idx loc))))
(unless (or no-warn cells) (unless (or no-warn cells)
(util:lgw "not found" addr reg idx)) (util:lgw "not found" addr reg idx))
cells))) cells)))

View file

@ -11,7 +11,7 @@
(in-package :scopes/csys/program/basic) (in-package :scopes/csys/program/basic)
;;;; basic-0: minimal recursive system ;;;; basic-0: minimal recursive system - "self-inhibit"
(defun prog-b0 () (defun prog-b0 ()
(let ((val-action (csys:value-add :limits '(0)))) (let ((val-action (csys:value-add :limits '(0))))
@ -29,7 +29,7 @@
(csys:send-switch self :active) (csys:send-switch self :active)
nil))) nil)))
;;;; basic-1: minimal cross-linked system ;;;; basic-1: minimal cross-linked system - "distinction"
(defun config-b1 () (defun config-b1 ()
(list (prog-b1) :zero-cat :s01 (list (prog-b1) :zero-cat :s01
@ -62,7 +62,7 @@
(csys:send-switch self :active) (csys:send-switch self :active)
nil))) nil)))
;;;; basic-2: three-layer recursive system ;;;; basic-2: three-layer recursive system - "delayed distinction"
(defun config-b2 () (defun config-b2 ()
(list (prog-b2) :zero-cat :c02 :zero-val 2 (list (prog-b2) :zero-cat :c02 :zero-val 2

22
shape/space.lisp Normal file
View file

@ -0,0 +1,22 @@
;;;; cl-scopes/shape/space
;;;; definitions for (spatial) registering and retrieving objects by location
(defpackage :scopes/shape/space
(:use :common-lisp)
(:local-nicknames (:alx :alexandria))
(:export #:create #:put #:get #:query))
(in-package :scopes/shape/space)
(defun create ()
(make-hash-table :test #'equalp))
(defun put (space key value)
(setf (gethash key space) value))
(defun get (space key)
(gethash key space))
(defun query (space pattern)
nil)

View file

@ -1,18 +0,0 @@
;;;; cl-scopes/space
;;;; definitions for spatial registering and retrieving objects by location
(defpackage :scopes/space
(:use :common-lisp)
(:local-nicknames (:alx :alexandria))
(:export #:create #:put #:query))
(in-package :scopes/space)
(defclass index ()
((data :reader data :initform (make-hash-table :test #'equal))))
(defun create ()
(make-instance 'index))

View file

@ -89,8 +89,8 @@
(deftest test-basic-2 () (deftest test-basic-2 ()
(let ((environ:*env* (setup (basic:config-b2) :delay 0.03))) (let ((environ:*env* (setup (basic:config-b2) :delay 0.03)))
(environ:send-value '(:s02 "1-0") 1) (sleep 0.0001) (environ:send-value '(:s02 "1-0") 1) (sleep 0.0002)
(environ:send-value '(:s02 "1-1") 2) (sleep 0.0001) (environ:send-value '(:s02 "1-1") 1) (sleep 0.0002)
(environ:send-value '(:s02 "1-0") 2) (environ:send-value '(:s02 "1-0") 2)
(teardown))) (teardown)))