summaryrefslogtreecommitdiff
path: root/noflet.el
diff options
context:
space:
mode:
authorNic Ferier <nic@ferrier.me.uk>2013-06-02 10:23:14 +0100
committerNic Ferier <nic@ferrier.me.uk>2013-06-02 10:23:14 +0100
commit7e2ef09a4d3e593275da63765c1da424f3158c7f (patch)
treec9275c20eed65b81db62652cacb6cc8f4d31a512 /noflet.el
parent64e103c93d1954b5be91eadec291ac78031740bc (diff)
pinch the debug decl from flet for noflet
Diffstat (limited to 'noflet.el')
-rw-r--r--noflet.el30
1 files changed, 29 insertions, 1 deletions
diff --git a/noflet.el b/noflet.el
index e0435f4..4cfb8c8 100644
--- a/noflet.el
+++ b/noflet.el
@@ -113,8 +113,36 @@ the name `this-fn':
(expand-file-name \"~/test\"))
This is great for overriding in testing and such like."
- (declare (indent defun))
+ (declare (debug ((&rest (cl-defun)) cl-declarations body))
+ (indent defun))
(apply 'noflet|expand bindings body))
+(defmacro* let-while ((var expression) &rest body)
+ "A simple binding loop.
+
+VAR is bound to EXPRESSION repeatedly until `nil'.
+
+BODY is evaluated each time."
+ (declare
+ (debug (sexp sexp &rest form))
+ (indent 1))
+ (let ((expression-proc (make-symbol "exprp")))
+ `(let ((,expression-proc (lambda () ,expression)))
+ (let ((,var (funcall ,expression-proc)))
+ (while ,var
+ (progn ,@body)
+ (setq ,var (funcall ,expression-proc)))))))
+
+(defun let-while-test ()
+ (catch :io
+ (let ((lines '("line 1" "line 2")))
+ (flet ((get-line ()
+ (or
+ (pop lines)
+ (throw :io :eof))))
+ (let-while (line (get-line))
+ (message "the line is: %s" line))))))
+
+
(provide 'noflet)
;;; noflet.el ends here