diff options
author | Nic Ferier <nic@ferrier.me.uk> | 2013-06-02 10:23:14 +0100 |
---|---|---|
committer | Nic Ferier <nic@ferrier.me.uk> | 2013-06-02 10:23:14 +0100 |
commit | 7e2ef09a4d3e593275da63765c1da424f3158c7f (patch) | |
tree | c9275c20eed65b81db62652cacb6cc8f4d31a512 /noflet.el | |
parent | 64e103c93d1954b5be91eadec291ac78031740bc (diff) |
pinch the debug decl from flet for noflet
Diffstat (limited to 'noflet.el')
-rw-r--r-- | noflet.el | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -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 |