provide var definition with get and put operations
This commit is contained in:
parent
6e40672f10
commit
df88bec20a
2 changed files with 31 additions and 8 deletions
|
@ -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)))
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Add table
Reference in a new issue