diff --git a/forge/sf.lisp b/forge/sf.lisp
index 52c801a..44cdccb 100644
--- a/forge/sf.lisp
+++ b/forge/sf.lisp
@@ -4,7 +4,8 @@
(defpackage :scopes/forge/sf
(:use :common-lisp)
- (:local-nicknames (:iter :scopes/util/iter))
+ (:local-nicknames (:iter :scopes/util/iter)
+ (:util :scopes/util))
(:export #:*input* #:*stack*
#:word #:comp-word
#:exec-list #:exec-input #:comp-input #:call
@@ -31,14 +32,19 @@
(:method ((it t))
(pushd it))
(:method ((it symbol))
- (exec-item (symbol-value it))))
+ (let ((v (symbol-value it)))
+ (when v
+ (exec-item v)))))
(defgeneric comp-item (it)
(:method ((it t))
(push #'lit *buffer*)
(push it *buffer*))
(:method ((it symbol))
- (comp-item (symbol-value it))))
+ (let ((v (symbol-value it)))
+ (when v
+ (util:lgi it v)
+ (comp-item v)))))
;;;; class word*
@@ -74,6 +80,7 @@
(defun call (code)
(let ((*code* (make-instance 'iter:list-iterator :data code)))
+ (util:lgi code)
(iter:process *code* #'funcall)))
(defun reg (sym fn &optional (cls 'word))
@@ -84,8 +91,8 @@
(reg sym #'(lambda () (pushd (funcall fn (popd) (popd))))))
(defun reg-code (&optional (cls 'word))
- (let ((name (popd))
- (code (popd)))
+ (let* ((name (popd))
+ (code (popd)))
(reg name #'(lambda () (call code)) cls)))
(defun pushd (v)
@@ -106,7 +113,7 @@
(:use :common-lisp)
(:local-nicknames (:f :scopes/forge/sf)
(:iter :scopes/util/iter))
- (:export #:add #:mul #:dup #:in #:? #:lit
+ (:export #:add #:mul #:dup #:swp #:in #:? #:lit #:defer
#:))
(in-package :sf-builtin)
@@ -115,10 +122,12 @@
(f:reg2 'mul #'*)
(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 'lit #'f:lit)
+(f:reg 'defer #'(lambda () (push (iter:next-value f::*code*) f::*buffer*)))
(f:reg ' in square reg))
(forge:exec-list '(7 square))
- (== (forge:popd) 49)
- (t:show-result))
-
+ (== (forge:popd) 49))
+(deftest test-def ()
+ (forge:exec-list '( in ))
+ (forge:exec-list '(3 cube))
+ (== (forge:popd) 27))
diff --git a/util/iter.lisp b/util/iter.lisp
index 65900d8..7506d1d 100644
--- a/util/iter.lisp
+++ b/util/iter.lisp
@@ -29,8 +29,8 @@
(defgeneric process (it fn)
(:method ((it iterator) fn)
- (do ((eoi (next it) (next it)))
- ((or eoi (stopped it)))
+ (do ((eoi (next it) (or (stopped it) (next it))))
+ (eoi)
(funcall fn (value it)))
(setf (stopped it) nil)))