From 3cfb89d9fd788327def4055267330163e23fd503 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 22 Apr 2024 12:23:34 +0200 Subject: [PATCH] add vocabulary to forge-env, with searching in chained vocabulary entries --- forge/forge.lisp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/forge/forge.lisp b/forge/forge.lisp index 8eb0ee4..cdfe523 100644 --- a/forge/forge.lisp +++ b/forge/forge.lisp @@ -13,7 +13,9 @@ (defclass forge-env () ((data-stack :initform nil :reader data-stack - :accessor data-stack!))) + :accessor data-stack!) + (vocabulary :initform (list *builtins*) + :accessor vocabulary))) (defun forge-env () (make-instance 'forge-env)) @@ -21,12 +23,18 @@ (defun exec (fe code) (dolist (x code) (if (symbolp x) - (funcall (gethash (string-downcase (symbol-name x)) *builtins*) fe) + (funcall (find-word (vocabulary fe) x) fe) (pushd fe x)))) (defun register (voc key fn) (setf (gethash (string-downcase (symbol-name key)) voc) fn)) +(defun find-word (vocab key) + (let ((k (string-downcase (symbol-name key))) (result nil)) + (dolist (voc vocab) + (let ((v (gethash k voc))) + (if v (return v)))))) + ; built-in primitives (defun reg-b (key fn) (register *builtins* key fn))