From 944b3402e51feeedd3a52f2cbbb0f3c1c87363d9 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 24 May 2024 15:39:30 +0200 Subject: [PATCH] work in progress: organizing words in hash-tables; simple exec working again --- forge/forge.lisp | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/forge/forge.lisp b/forge/forge.lisp index cd70db7..a1138f9 100644 --- a/forge/forge.lisp +++ b/forge/forge.lisp @@ -8,6 +8,9 @@ #:forge-env #:dstack #:exec #:exec-str #:repl #:make-iseq #:isq-all #:isq-cur #:isq-next #:isq-end #:isq-add)) +(defpackage :sf-builtin) +(defpackage :sf-user) + (in-package :scopes/forge) ;;; iseq: iterable sequence @@ -44,7 +47,10 @@ (defclass forge-env () ((data-stack :initform nil :accessor data-stack) + (words :initform (make-hash-table)) (comp-words :initform (make-hash-table)) + (packages :initform '(:sf-user :sf-builtin)) + (current-package :initform :sf-user) (rp :initform (make-iseq)) (cp :initform (make-iseq)) (ip :initform (make-iseq)))) @@ -61,13 +67,21 @@ (defun define-comp-word (sym fn) (setf (gethash sym (slot-value *forge-env* 'comp-words)) fn)) +(defun register (p sym fn) + (let ((w (intern (string sym) p))) + (setf (gethash w (slot-value *forge-env* 'words)) fn))) + ;;; builtins -(defvar add #'(lambda () (pushd (+ (popd) (popd))))) +(defun reg-b (sym fn) + (register :sf-builtin sym fn)) -(defvar dup #'(lambda () (pushd (car (dstack))))) +(reg-b 'add #'(lambda () (pushd (+ (popd) (popd))))) + +(reg-b 'dup #'(lambda () (pushd (car (dstack))))) (defvar lit #'(lambda () (pushd (isq-next (fip))))) +(reg-b 'lit lit) (define-comp-word 'def #'(lambda () @@ -111,20 +125,25 @@ (isq-all (fcp))) (defun comp-symbol (sym) - (let* ((word (get-word sym)) - (comp-word (get-comp-word word))) - (if comp-word - (funcall comp-word) - (comp-item (symbol-value word))))) + (let* ((w (get-word sym)) + (comp-fn (get-comp-word w))) + (if comp-fn + (funcall comp-fn) + (comp-item (gethash w (slot-value *forge-env* 'words)))))) (defun comp-item (item) (isq-add (fcp) item)) (defun get-word (sym) - (intern (string sym) :scopes/forge)) + (let ((name (string sym))) + (dolist (p (slot-value *forge-env* 'packages)) + (let ((w (find-symbol name p))) + (if w + (return-from get-word w)))) + (intern name (slot-value *forge-env* 'current-package)))) -(defun get-comp-word (sym) - (gethash sym (slot-value *forge-env* 'comp-words))) +(defun get-comp-word (w) + (gethash w (slot-value *forge-env* 'comp-words))) ;;; internal definitions