From 5fcfaf6fd49b1aef11f0c7c1160b4f8143030312 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 25 Sep 2026 13:17:16 +0200 Subject: [PATCH] csys, work in progress: use space for finding free locationsor cells to connect to --- csys/csys.lisp | 12 +++++------- csys/environ.lisp | 16 ++++++++++------ csys/program/basic.lisp | 2 +- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/csys/csys.lisp b/csys/csys.lisp index edf7260..22c4b5c 100644 --- a/csys/csys.lisp +++ b/csys/csys.lisp @@ -39,15 +39,15 @@ (defmethod initialize-instance :after ((sc scope) &key &allow-other-keys) (set-proc sc)) -(defun reset-scope (scp &rest args) +(defun reset-scope (scope &rest args) (let* ((addr (getf args :addr)) (categ (if addr (list (car addr) (cadr addr)) - (getf args :categ (categ scp))))) + (getf args :categ (categ scope))))) (setf args (alx:remove-from-plist args :categ :addr)) (apply #'scope - (getf args :program (program scp)) - (getf args :environ (environ scp)) + (getf args :program (program scope)) + (getf args :environ (environ scope)) :categ categ args))) @@ -231,9 +231,7 @@ (defun send-create (cell &rest args &key (domain *domain*) (cat :c00) loc connect op &allow-other-keys) - (let ((args+ (if loc - `(:addr ,(list domain cat loc)) - `(:categ ,(list domain cat))))) + (let ((args+ `(:addr ,(list domain cat loc)))) (setf args (alx:remove-from-plist args :domain :cat :loc)) (send-message cell (list domain :create) (append args+ args)))) diff --git a/csys/environ.lisp b/csys/environ.lisp index db91cb6..d432a7e 100644 --- a/csys/environ.lisp +++ b/csys/environ.lisp @@ -76,7 +76,7 @@ (defun cell-created (msg scope) (let* ((data (shape:data msg)) - (addr (getf data :addr (getf data :categ))) + (addr (getf data :addr)) (new (getf data :new))) (when addr (register-cell scope addr new)) @@ -98,12 +98,11 @@ nil) (defun forward-connect (msg scope) - ;; TODO: target may be nil => replace with list of candidates (let* ((data (shape:data msg)) (tgt (getf data :target)) (cust (actor:customer msg))) (cond - ((null tgt) (setf (getf data :target) (find-cell-near scope cust))) + ((null tgt) (setf (getf data :target) (find-cells-near scope cust))) ((listp tgt) (setf (getf data :target) (find-cell scope tgt)))) (forward (message:create (shape:head msg) :data data :customer cust) scope))) @@ -130,14 +129,14 @@ ;;;; internal helpers (defun register-cell (scope addr cell) - (destructuring-bind (dom cat &optional (loc "")) addr + (destructuring-bind (dom cat loc) addr (let* ((reg (spaces scope)) (spc (getf reg dom))) (space:put spc loc cell) (setf (gethash cell (cells scope)) addr)))) (defun find-cell (scope addr &key no-warn) - (destructuring-bind (dom cat &optional loc) addr + (destructuring-bind (dom cat loc) addr (let* ((reg (spaces scope)) (spc (getf reg dom)) (cell (space:fetch spc loc))) @@ -145,5 +144,10 @@ (util:lgw "not found" addr reg spc)) cell))) -(defun find-cell-near (scope cell)) +(defun find-cells-near (scope cell &key (dist 2)) + (destructuring-bind (&optional dom cat loc) (getf cell (cells scope)) + (when (null loc) + (error "cell not found or loc missing! scope: ~s, cell: ~s" scope cell)) + (let ((space (getf dom (spaces scope)))) + (space:neighbors space loc :dist dist)))) diff --git a/csys/program/basic.lisp b/csys/program/basic.lisp index c98d35a..99aa402 100644 --- a/csys/program/basic.lisp +++ b/csys/program/basic.lisp @@ -23,7 +23,7 @@ (defun b0-next-zero () (lambda (msg scope) (let ((self actor:*self*)) - (csys:send-create self :cat :e00 :connect :succ) + (csys:send-create self :cat :e00 :loc #(1 0) :connect :succ) (csys:send-create self :cat :s00 :loc #(0 1) :connect :pred) (csys:send-connect self self :op (csys:multiply -1)) (csys:send-switch self :active)