diff --git a/forge/forge.lisp b/forge/forge.lisp index 6ee87c1..7bd5303 100644 --- a/forge/forge.lisp +++ b/forge/forge.lisp @@ -59,21 +59,35 @@ (reg-b "??" #'(lambda (fe) (format t "~a~%" (data-stack fe)))) (reg-b "def" #'(lambda (fe) - (let ((voc (car(vocabulary fe))) - (name (popd fe)) + (let ((name (popd fe)) (code (popd fe))) - (register voc name #'(lambda (fe) (exec fe code)))))) + (register (voc fe) name #'(lambda (fe) (exec fe code)))))) (reg-b "const" #'(lambda (fe) (let ((name (popd fe)) (value (popd fe))) - (register (car(vocabulary fe)) name #'(lambda (fe) (pushd fe value)))))) + (register (voc fe) name #'(lambda (fe) (pushd fe value)))))) + +(reg-b "var" #'(lambda (fe) + (let ((name (popd fe)) + (var (list (popd fe)))) + (register (voc fe) name #'(lambda (fe) + (pushd fe #'(lambda (fn) + (funcall fn var)))))))) + +(reg-b "get" #'(lambda (fe) + (funcall (popd fe) #'(lambda (x) (pushd fe (car x)))))) + +(reg-b "put" #'(lambda (fe) + (let ((fn (popd fe)) + (vl (popd fe))) + (funcall fn #'(lambda (x) (setf (car x) vl)))))) ; internal definitions -(defun popd (fe) - (pop (data-stack! fe))) +(defun voc (fe) (car (vocabulary fe))) -(defun pushd (fe v) - (push v (data-stack! fe))) +(defun popd (fe) (pop (data-stack! fe))) + +(defun pushd (fe v) (push v (data-stack! fe))) diff --git a/test/test-forge.lisp b/test/test-forge.lisp index 6b10abe..84e9129 100644 --- a/test/test-forge.lisp +++ b/test/test-forge.lisp @@ -18,6 +18,7 @@ (test-def tst fe) (test-exec-str tst fe) (test-const tst fe) + (test-var tst fe) (sct:result tst))) (defun test-exec (tst fe) @@ -37,3 +38,11 @@ (scf:exec-str fe "17 \"c1\" const") (scf:exec-str fe "c1 square") (sct:assert-eq tst (car (scf:data-stack fe)) 289)) + +(defun test-var (tst fe) + (scf:exec fe '(24 "v1" var)) + (scf:exec fe '(v1 get 2 *)) + (sct:assert-eq tst (car (scf:data-stack fe)) 48) + (scf:exec fe '(5 v1 put)) + (scf:exec fe '(v1 get 2 *)) + (sct:assert-eq tst (car (scf:data-stack fe)) 10))