summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sb-eval2.lisp8
1 files changed, 7 insertions, 1 deletions
diff --git a/sb-eval2.lisp b/sb-eval2.lisp
index f5fb4dd..db4ded3 100644
--- a/sb-eval2.lisp
+++ b/sb-eval2.lisp
@@ -468,6 +468,12 @@
,@body))
(,loop-var ,@(mapcar #'second bindings))))
+(defmacro dnlet (loop-var bindings &body body)
+ `(labels ((,loop-var ,(mapcar #'first bindings)
+ ,@body))
+ (declare (dynamic-extent #',loop-var))
+ (,loop-var ,@(mapcar #'second bindings))))
+
(declaim (ftype (function * eval-closure) prepare-lambda))
(defun prepare-lambda (lambda-form context &key (name nil namep))
(destructuring-bind (lambda-list &rest exprs) lambda-form
@@ -536,7 +542,7 @@
;; All this ELT and LENGTH stuff is not as
;; inefficient as it looks. SBCL transforms
;; &rest into &more here.
- (nlet iter
+ (dnlet iter
((rest
(when (or restp keyp)
(loop for i