forge/sf: tests, fixes - define wforge definition word
This commit is contained in:
parent
aa8017be9c
commit
65fbf0aac4
3 changed files with 31 additions and 18 deletions
|
@ -4,7 +4,8 @@
|
||||||
|
|
||||||
(defpackage :scopes/forge/sf
|
(defpackage :scopes/forge/sf
|
||||||
(:use :common-lisp)
|
(:use :common-lisp)
|
||||||
(:local-nicknames (:iter :scopes/util/iter))
|
(:local-nicknames (:iter :scopes/util/iter)
|
||||||
|
(:util :scopes/util))
|
||||||
(:export #:*input* #:*stack*
|
(:export #:*input* #:*stack*
|
||||||
#:word #:comp-word
|
#:word #:comp-word
|
||||||
#:exec-list #:exec-input #:comp-input #:call
|
#:exec-list #:exec-input #:comp-input #:call
|
||||||
|
@ -31,14 +32,19 @@
|
||||||
(:method ((it t))
|
(:method ((it t))
|
||||||
(pushd it))
|
(pushd it))
|
||||||
(:method ((it symbol))
|
(:method ((it symbol))
|
||||||
(exec-item (symbol-value it))))
|
(let ((v (symbol-value it)))
|
||||||
|
(when v
|
||||||
|
(exec-item v)))))
|
||||||
|
|
||||||
(defgeneric comp-item (it)
|
(defgeneric comp-item (it)
|
||||||
(:method ((it t))
|
(:method ((it t))
|
||||||
(push #'lit *buffer*)
|
(push #'lit *buffer*)
|
||||||
(push it *buffer*))
|
(push it *buffer*))
|
||||||
(:method ((it symbol))
|
(:method ((it symbol))
|
||||||
(comp-item (symbol-value it))))
|
(let ((v (symbol-value it)))
|
||||||
|
(when v
|
||||||
|
(util:lgi it v)
|
||||||
|
(comp-item v)))))
|
||||||
|
|
||||||
;;;; class word*
|
;;;; class word*
|
||||||
|
|
||||||
|
@ -74,6 +80,7 @@
|
||||||
|
|
||||||
(defun call (code)
|
(defun call (code)
|
||||||
(let ((*code* (make-instance 'iter:list-iterator :data code)))
|
(let ((*code* (make-instance 'iter:list-iterator :data code)))
|
||||||
|
(util:lgi code)
|
||||||
(iter:process *code* #'funcall)))
|
(iter:process *code* #'funcall)))
|
||||||
|
|
||||||
(defun reg (sym fn &optional (cls 'word))
|
(defun reg (sym fn &optional (cls 'word))
|
||||||
|
@ -84,8 +91,8 @@
|
||||||
(reg sym #'(lambda () (pushd (funcall fn (popd) (popd))))))
|
(reg sym #'(lambda () (pushd (funcall fn (popd) (popd))))))
|
||||||
|
|
||||||
(defun reg-code (&optional (cls 'word))
|
(defun reg-code (&optional (cls 'word))
|
||||||
(let ((name (popd))
|
(let* ((name (popd))
|
||||||
(code (popd)))
|
(code (popd)))
|
||||||
(reg name #'(lambda () (call code)) cls)))
|
(reg name #'(lambda () (call code)) cls)))
|
||||||
|
|
||||||
(defun pushd (v)
|
(defun pushd (v)
|
||||||
|
@ -106,7 +113,7 @@
|
||||||
(:use :common-lisp)
|
(:use :common-lisp)
|
||||||
(:local-nicknames (:f :scopes/forge/sf)
|
(:local-nicknames (:f :scopes/forge/sf)
|
||||||
(:iter :scopes/util/iter))
|
(:iter :scopes/util/iter))
|
||||||
(:export #:add #:mul #:dup #:in #:? #:lit
|
(:export #:add #:mul #:dup #:swp #:in #:? #:lit #:defer
|
||||||
#:<comp #:reg #:regc #:/>))
|
#:<comp #:reg #:regc #:/>))
|
||||||
|
|
||||||
(in-package :sf-builtin)
|
(in-package :sf-builtin)
|
||||||
|
@ -115,10 +122,12 @@
|
||||||
(f:reg2 'mul #'*)
|
(f:reg2 'mul #'*)
|
||||||
|
|
||||||
(f:reg 'dup #'(lambda () (f:pushd (f:peekd))))
|
(f:reg 'dup #'(lambda () (f:pushd (f:peekd))))
|
||||||
|
(f:reg 'swp #'(lambda () (let ((a (f:popd)) (b (f:popd))) (f:pushd a) (f:pushd b))))
|
||||||
|
|
||||||
(f:reg 'in #'(lambda () (f:pushd (iter:next-value f:*input*))))
|
(f:reg 'in #'(lambda () (f:pushd (iter:next-value f:*input*))))
|
||||||
|
|
||||||
(f:reg 'lit #'f:lit)
|
(f:reg 'lit #'f:lit)
|
||||||
|
(f:reg 'defer #'(lambda () (push (iter:next-value f::*code*) f::*buffer*)))
|
||||||
|
|
||||||
(f:reg '<comp #'f:comp-input)
|
(f:reg '<comp #'f:comp-input)
|
||||||
|
|
||||||
|
|
|
@ -15,20 +15,24 @@
|
||||||
|
|
||||||
(defun run ()
|
(defun run ()
|
||||||
(let ((t:*test-suite* (t:test-suite "forge/sf")))
|
(let ((t:*test-suite* (t:test-suite "forge/sf")))
|
||||||
;(forge:*forge-env* (forge:forge-env)))
|
(unwind-protect
|
||||||
;(setf forge:*forge-env* (forge:forge-env))
|
(progn
|
||||||
;(forge:setup-builtins)
|
;(forge:setup-builtins)
|
||||||
(test-exec)))
|
(test-exec)
|
||||||
|
(test-def)))
|
||||||
|
(util:lgi forge:*stack*)
|
||||||
|
(t:show-result)))
|
||||||
|
|
||||||
(deftest test-exec ()
|
(deftest test-exec ()
|
||||||
;(forge:exec-str "4 2 add")
|
;(forge:exec-str "4 2 add")
|
||||||
(forge:exec-list '(4 2 add))
|
(forge:exec-list '(4 2 add))
|
||||||
(== (forge:popd) 6)
|
(== (forge:popd) 6)
|
||||||
(forge:exec-list '(<comp dup mul))
|
(forge:exec-list '(<comp dup mul /> in square reg))
|
||||||
(util:lgi forge:*stack*)
|
|
||||||
(forge:exec-list '(in square reg))
|
|
||||||
(forge:exec-list '(7 square))
|
(forge:exec-list '(7 square))
|
||||||
(== (forge:popd) 49)
|
(== (forge:popd) 49))
|
||||||
(t:show-result))
|
|
||||||
|
|
||||||
|
|
||||||
|
(deftest test-def ()
|
||||||
|
(forge:exec-list '(<comp in <comp swp reg /> in <def reg))
|
||||||
|
(forge:exec-list '(<def cube dup dup mul mul />))
|
||||||
|
(forge:exec-list '(3 cube))
|
||||||
|
(== (forge:popd) 27))
|
||||||
|
|
|
@ -29,8 +29,8 @@
|
||||||
|
|
||||||
(defgeneric process (it fn)
|
(defgeneric process (it fn)
|
||||||
(:method ((it iterator) fn)
|
(:method ((it iterator) fn)
|
||||||
(do ((eoi (next it) (next it)))
|
(do ((eoi (next it) (or (stopped it) (next it))))
|
||||||
((or eoi (stopped it)))
|
(eoi)
|
||||||
(funcall fn (value it)))
|
(funcall fn (value it)))
|
||||||
(setf (stopped it) nil)))
|
(setf (stopped it) nil)))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue