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