Make -if-let and -when-let families destructure their arguments

master
Fredrik Bergroth 11 years ago
parent 75d29a2680
commit 03b98ca5a9
  1. 55
      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 _."

Loading…
Cancel
Save