diff --git a/README.md b/README.md index 4b80695..9ea6343 100644 --- a/README.md +++ b/README.md @@ -142,8 +142,8 @@ To get function combinators: * [-when-let](#-when-let-var-val-rest-body) `(var-val &rest body)` * [-when-let*](#-when-let-vars-vals-rest-body) `(vars-vals &rest body)` -* [-if-let](#-if-let-var-val-then-optional-else) `(var-val then &optional else)` -* [-if-let*](#-if-let-vars-vals-then-optional-else) `(vars-vals then &optional else)` +* [-if-let](#-if-let-var-val-then-rest-else) `(var-val then &rest else)` +* [-if-let*](#-if-let-vars-vals-then-rest-else) `(vars-vals then &rest else)` ### Side-effects @@ -1019,7 +1019,7 @@ If all `vals` evaluate to true, bind them to their corresponding (-when-let* ((x 5) (y nil) (z 7)) (+ x y z)) ;; => nil ``` -#### -if-let `(var-val then &optional else)` +#### -if-let `(var-val then &rest else)` If `val` evaluates to non-nil, bind it to `var` and do `then`, otherwise do `else`. `var-val` should be a (`var` `val`) pair. @@ -1029,7 +1029,7 @@ otherwise do `else`. `var-val` should be a (`var` `val`) pair. (--if-let (even? 4) it nil) ;; => t ``` -#### -if-let* `(vars-vals then &optional else)` +#### -if-let* `(vars-vals then &rest else)` If all `vals` evaluate to true, bind them to their corresponding `vars` and do `then`, otherwise do `else`. `vars-vals` should be a list diff --git a/dash.el b/dash.el index 76fa4d4..aa7c545 100644 --- a/dash.el +++ b/dash.el @@ -797,6 +797,7 @@ in in second form, etc." (defmacro -when-let (var-val &rest body) "If VAL evaluates to non-nil, bind it to VAR and execute body. VAR-VAL should be a (VAR VAL) pair." + (declare (debug ((symbolp form) body))) (let ((var (car var-val)) (val (cadr var-val))) `(let ((,var ,val)) @@ -807,6 +808,7 @@ VAR-VAL should be a (VAR VAL) pair." "If all VALS evaluate to true, bind them to their corresponding VARS and execute body. VARS-VALS should be a list of (VAR VAL) pairs (corresponding to bindings of `let*')." + (declare (debug ((&rest (symbolp form)) body))) (if (= (length vars-vals) 1) `(-when-let ,(car vars-vals) ,@body) @@ -817,42 +819,46 @@ VAR-VAL should be a (VAR VAL) pair." (defmacro --when-let (val &rest body) "If VAL evaluates to non-nil, bind it to `it' and execute body." + (declare (debug (form body))) `(let ((it ,val)) (when it ,@body))) -(defmacro -if-let (var-val then &optional else) +(defmacro -if-let (var-val then &rest else) "If VAL evaluates to non-nil, bind it to VAR and do THEN, otherwise do ELSE. VAR-VAL should be a (VAR VAL) pair." + (declare (debug ((symbolp form) form body))) (let ((var (car var-val)) (val (cadr var-val))) `(let ((,var ,val)) - (if ,var ,then ,else)))) + (if ,var ,then ,@else)))) -(defmacro -if-let* (vars-vals then &optional else) +(defmacro -if-let* (vars-vals then &rest else) "If all VALS evaluate to true, bind them to their corresponding VARS and do THEN, otherwise do ELSE. VARS-VALS should be a list of (VAR VAL) pairs (corresponding to the bindings of `let*')." + (declare (debug ((&rest (symbolp form)) form body))) (let ((first-pair (car vars-vals)) (rest (cdr vars-vals))) (if (= (length vars-vals) 1) - `(-if-let ,first-pair ,then ,else) + `(-if-let ,first-pair ,then ,@else) `(-if-let ,first-pair - (-if-let* ,rest ,then ,else) - ,else)))) + (-if-let* ,rest ,then ,@else) + ,@else)))) -(defmacro --if-let (val then &optional else) +(defmacro --if-let (val then &rest else) "If VAL evaluates to non-nil, bind it to `it' and do THEN, otherwise do ELSE." + (declare (debug (form form body))) `(let ((it ,val)) - (if it ,then ,else))) + (if it ,then ,@else))) (put '-when-let 'lisp-indent-function 1) (put '-when-let* 'lisp-indent-function 1) (put '--when-let 'lisp-indent-function 1) -(put '-if-let 'lisp-indent-function 1) -(put '-if-let* 'lisp-indent-function 1) -(put '--if-let 'lisp-indent-function 1) +(put '-if-let 'lisp-indent-function 2) +(put '-if-let* 'lisp-indent-function 2) +(put '--if-let 'lisp-indent-function 2) (defun -distinct (list) "Return a new list with all duplicates removed.