use hash table for registering words, with *builtins* default registry
This commit is contained in:
parent
9c56ae475b
commit
dcb5208a25
1 changed files with 10 additions and 4 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue