From dcb5208a25e56eddd0cc615d84f888f0c3746d86 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 22 Apr 2024 10:24:17 +0200 Subject: [PATCH] use hash table for registering words, with *builtins* default registry --- forge/forge.lisp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/forge/forge.lisp b/forge/forge.lisp index 1a80be7..8eb0ee4 100644 --- a/forge/forge.lisp +++ b/forge/forge.lisp @@ -8,6 +8,8 @@ (in-package :scopes/forge) +(defvar *builtins* (make-hash-table :test 'equalp)) + (defclass forge-env () ((data-stack :initform nil :reader data-stack @@ -19,13 +21,17 @@ (defun exec (fe code) (dolist (x code) (if (symbolp x) - (funcall (find-symbol (symbol-name x) :scopes/forge) fe) + (funcall (gethash (string-downcase (symbol-name x)) *builtins*) fe) (pushd fe x)))) -; forge primitives +(defun register (voc key fn) + (setf (gethash (string-downcase (symbol-name key)) voc) fn)) -(defun add (fe) - (pushd fe (+ (popd fe) (popd fe)))) +; built-in primitives + +(defun reg-b (key fn) (register *builtins* key fn)) + +(reg-b 'add #'(lambda (fe) (pushd fe (+ (popd fe) (popd fe))))) ; internal definitions