use hash table for registering words, with *builtins* default registry

This commit is contained in:
Helmut Merz 2024-04-22 10:24:17 +02:00
parent 9c56ae475b
commit dcb5208a25

View file

@ -8,6 +8,8 @@
(in-package :scopes/forge) (in-package :scopes/forge)
(defvar *builtins* (make-hash-table :test 'equalp))
(defclass forge-env () (defclass forge-env ()
((data-stack :initform nil ((data-stack :initform nil
:reader data-stack :reader data-stack
@ -19,13 +21,17 @@
(defun exec (fe code) (defun exec (fe code)
(dolist (x code) (dolist (x code)
(if (symbolp x) (if (symbolp x)
(funcall (find-symbol (symbol-name x) :scopes/forge) fe) (funcall (gethash (string-downcase (symbol-name x)) *builtins*) fe)
(pushd fe x)))) (pushd fe x))))
; forge primitives (defun register (voc key fn)
(setf (gethash (string-downcase (symbol-name key)) voc) fn))
(defun add (fe) ; built-in primitives
(pushd fe (+ (popd fe) (popd fe))))
(defun reg-b (key fn) (register *builtins* key fn))
(reg-b 'add #'(lambda (fe) (pushd fe (+ (popd fe) (popd fe)))))
; internal definitions ; internal definitions