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))