work in progress: forge sequence (pseudo-pointer)

This commit is contained in:
Helmut Merz 2024-05-19 10:03:39 +02:00
parent e0e65efa39
commit 7dd30882e0
3 changed files with 55 additions and 2 deletions

View file

@ -5,7 +5,8 @@
(defpackage :scopes/forge (defpackage :scopes/forge
(:use :common-lisp) (:use :common-lisp)
(:export #:*forge-env* (:export #:*forge-env*
#:forge-env #:dstack #:exec #:exec-str #:repl)) #:forge-env #:dstack #:exec #:exec-str #:repl
#:make-seq #:seq-all #:seq-cur #:seq-end #:seq-add))
(in-package :scopes/forge) (in-package :scopes/forge)
@ -39,6 +40,10 @@
(compiled-function (funcall x)) (compiled-function (funcall x))
(t (pushd x))))) (t (pushd x)))))
(defun call (code)
(dolist (x code)
(funcall x)))
(defun repl () (defun repl ()
(do ((input (read-line) (read-line))) ((string= input "q") nil) (do ((input (read-line) (read-line))) ((string= input "q") nil)
(exec-str input))) (exec-str input)))
@ -80,7 +85,7 @@
(reg-b "def" #'(lambda () (reg-b "def" #'(lambda ()
(let* ((name (popd)) (let* ((name (popd))
(code (comp (popd)))) (code (comp (popd))))
(register (voc) name #'(lambda () (exec code)))))) (register (voc) name #'(lambda () (call code))))))
(reg-b "const" #'(lambda () (reg-b "const" #'(lambda ()
(let ((name (popd)) (let ((name (popd))
@ -110,3 +115,42 @@
(defun pushd (v) (push v (data-stack! *forge-env*))) (defun pushd (v) (push v (data-stack! *forge-env*)))
; sequence
(defun make-seq ()
(let* ((start (list nil))
(p-cur (list start))
(p-end (list start)))
#'(lambda (fn)
(funcall fn start p-cur p-end))))
(defun seq-all (seq)
(funcall seq #'(lambda (start cur end)
(declare (ignore cur) (ignore end))
start)))
(defun seq-cur (seq)
(funcall seq #'(lambda (start p-cur end)
(declare (ignore start) (ignore end))
(car (car p-cur)))))
(defun seq-end (seq)
(funcall seq #'(lambda (start cur p-end)
(declare (ignore start) (ignore cur))
(car (car p-end)))))
(defun seq-add (seq v)
(funcall seq #'(lambda (start cur p-end)
(declare (ignore cur))
(add-to-sequence v start p-end))))
(defun add-to-sequence (v start p-end)
(if (car start)
(progn
(setf (cdr (car p-end)) (list v))
(pop (car p-end)))
(setf (car start) v)))
(defun add-to-seq (v p-end)
(setf (cdr (car p-end)) (list v))
(pop (car p-end)))

View file

@ -13,6 +13,7 @@
(defun run () (defun run ()
(let ((t:*tst* (t:test-suite))) (let ((t:*tst* (t:test-suite)))
(test-seq)
(test-exec) (test-exec)
;(format t "~%data-stack ~a" (dstack)) ;(format t "~%data-stack ~a" (dstack))
(test-def) (test-def)
@ -21,6 +22,13 @@
(test-var) (test-var)
(t:show-result))) (t:show-result)))
(defun test-seq ()
(let ((seq (forge:make-seq)))
(forge:seq-add seq 1)
(forge:seq-add seq 2)
(== (forge:seq-cur seq) 1)
(== (forge:seq-end seq) 2)))
(defun test-exec () (defun test-exec ()
(forge:exec '(4 2 +)) (forge:exec '(4 2 +))
(== (car (forge:dstack)) 6)) (== (car (forge:dstack)) 6))

View file

@ -40,6 +40,7 @@
(defun test-track (st) (defun test-track (st)
(let (cont tr tr2 (data (make-hash-table))) (let (cont tr tr2 (data (make-hash-table)))
(setf cont (make-instance 'tracking:container :storage st)) (setf cont (make-instance 'tracking:container :storage st))
(defparameter cl-user::*cont cont)
(storage:drop-table st :tracks) (storage:drop-table st :tracks)
(tracking:create-table cont) (tracking:create-table cont)
(setf tr (tracking:make-item cont "t01" "john")) (setf tr (tracking:make-item cont "t01" "john"))