diff --git a/dash.el b/dash.el index d398e8b..96c581b 100644 --- a/dash.el +++ b/dash.el @@ -1116,68 +1116,61 @@ sorts it in descending order." (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." +VAR-VAL should be a (VAR VAL) pair. + +Note: binding is done according to `-let'." (declare (debug ((symbolp form) body)) (indent 1)) - (let ((var (car var-val)) - (val (cadr var-val))) - `(let ((,var ,val)) - (when ,var - ,@body)))) + `(-if-let ,var-val (progn ,@body))) (defmacro -when-let* (vars-vals &rest body) "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*')." +pairs. + +Note: binding is done according to `-let'." (declare (debug ((&rest (symbolp form)) body)) (indent 1)) - (if (= (length vars-vals) 1) - `(-when-let ,(car vars-vals) - ,@body) - `(-when-let ,(car vars-vals) - (-when-let* ,(cdr vars-vals) - ,@body)))) + `(-if-let* ,vars-vals (progn ,@body))) (defmacro --when-let (val &rest body) "If VAL evaluates to non-nil, bind it to `it' and execute body." (declare (debug (form body)) (indent 1)) - `(let ((it ,val)) - (when it - ,@body))) + `(--if-let ,val (progn ,@body))) (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." +otherwise do ELSE. VAR-VAL should be a (VAR VAL) pair. + +Note: binding is done according to `-let'." (declare (debug ((symbolp form) form body)) (indent 2)) - (let ((var (car var-val)) - (val (cadr var-val))) - `(let ((,var ,val)) - (if ,var ,then ,@else)))) + `(-if-let* (,var-val) ,then ,@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*')." +of (VAR VAL) pairs. + +Note: binding is done according to `-let'." (declare (debug ((&rest (symbolp form)) form body)) (indent 2)) - (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 - (-if-let* ,rest ,then ,@else) - ,@else)))) + (->> vars-vals + (-mapcat (-lambda ((pat src)) (dash--match pat src))) + (-reduce-r-from + (-lambda ((var val) memo) + `(let ((,var ,val)) + (if ,var ,memo ,@else))) + then))) (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)) (indent 2)) - `(let ((it ,val)) - (if it ,then ,@else))) + `(-if-let (it ,val) ,then ,@else)) (defun dash--match-ignore-place-p (symbol) "Return non-nil if SYMBOL is a symbol and starts with _."