diff --git a/forge/forge.lisp b/forge/forge.lisp
index 48281a0..58efe37 100644
--- a/forge/forge.lisp
+++ b/forge/forge.lisp
@@ -9,7 +9,8 @@
(:export #:forge-env #:vocabulary #:stack #:current-package
#:*forge-env* #:*input* #:*code*
#:word #:comp-word
- #:repl #:exec-list #:exec-string #:exec-input #:comp-input #:call
+ #:repl #:exec-list #:exec-string #:exec-stream
+ #:exec-input #:comp-input #:call
#:comp-item
#:next #:reg #:reg1 #:reg2 #:reg-code
#:pushd #:popd #:peekd))
@@ -94,6 +95,10 @@
(let ((*input* (iter:string-iterator s)))
(exec-input)))
+(defun exec-stream (s)
+ (let ((*input* (iter:stream-iterator s)))
+ (exec-input)))
+
(defun exec-input ()
(iter:process *input* #'exec-item))
diff --git a/test/test-forge.lisp b/test/test-forge.lisp
index 9555df5..98d1e44 100644
--- a/test/test-forge.lisp
+++ b/test/test-forge.lisp
@@ -31,7 +31,9 @@
(forge:exec-list '(7 square))
(== (forge:popd) 49)
(forge:exec-string "8 square")
- (== (forge:popd) 64))
+ (== (forge:popd) 64)
+ (forge:exec-stream (make-string-input-stream "12 square"))
+ (== (forge:popd) 144))
(deftest test-def ()
(forge:exec-list '( in