mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-31 20:02:42 +00:00
Add macro seq-setq
.
* doc/lispref/sequences.texi (seq-setq): Document this macro. * lisp/emacs-lisp/seq.el (seq-setq): New macro. * test/lisp/emacs-lisp/seq-tests.el (test-seq-setq): Test this macro (bug#50053).
This commit is contained in:
parent
adb6c3f1a4
commit
c58f8dda2b
@ -1111,6 +1111,23 @@ The @code{pcase} patterns provide an alternative facility for
|
||||
destructuring binding, see @ref{Destructuring with pcase Patterns}.
|
||||
@end defmac
|
||||
|
||||
@defmac seq-setq var-sequence val-sequence
|
||||
@cindex sequence destructuring
|
||||
This macro works similarly to @code{seq-let}, except that values are
|
||||
assigned to variables as if by @code{setq} instead of as in a
|
||||
@code{let} binding.
|
||||
|
||||
@example
|
||||
@group
|
||||
(let ((a nil)
|
||||
(b nil))
|
||||
(seq-setq (_ a _ b) '(1 2 3 4))
|
||||
(list a b))
|
||||
@result{} (2 4)
|
||||
@end group
|
||||
@end example
|
||||
@end defmac
|
||||
|
||||
@defun seq-random-elt sequence
|
||||
This function returns an element of @var{sequence} taken at random.
|
||||
|
||||
|
@ -93,6 +93,14 @@ name to be bound to the rest of SEQUENCE."
|
||||
(declare (indent 2) (debug (sexp form body)))
|
||||
`(pcase-let ((,(seq--make-pcase-patterns args) ,sequence))
|
||||
,@body))
|
||||
|
||||
(defmacro seq-setq (args sequence)
|
||||
"Assign to the variables in ARGS the elements of SEQUENCE.
|
||||
|
||||
ARGS can also include the `&rest' marker followed by a variable
|
||||
name to be bound to the rest of SEQUENCE."
|
||||
(declare (debug (sexp form)))
|
||||
`(pcase-setq ,(seq--make-pcase-patterns args) ,sequence))
|
||||
|
||||
|
||||
;;; Basic seq functions that have to be implemented by new sequence types
|
||||
|
@ -383,6 +383,30 @@ Evaluate BODY for each created sequence.
|
||||
(should (null b))
|
||||
(should (null c)))))
|
||||
|
||||
(ert-deftest test-seq-setq ()
|
||||
(with-test-sequences (seq '(1 2 3 4))
|
||||
(let (a b c d e)
|
||||
(seq-setq (a b c d e) seq)
|
||||
(should (= a 1))
|
||||
(should (= b 2))
|
||||
(should (= c 3))
|
||||
(should (= d 4))
|
||||
(should (null e)))
|
||||
(let (a b others)
|
||||
(seq-setq (a b &rest others) seq)
|
||||
(should (= a 1))
|
||||
(should (= b 2))
|
||||
(should (same-contents-p others (seq-drop seq 2)))))
|
||||
(let ((a)
|
||||
(seq '(1 (2 (3 (4))))))
|
||||
(seq-setq (_ (_ (_ (a)))) seq)
|
||||
(should (= a 4)))
|
||||
(let (seq a b c)
|
||||
(seq-setq (a b c) seq)
|
||||
(should (null a))
|
||||
(should (null b))
|
||||
(should (null c))))
|
||||
|
||||
(ert-deftest test-seq-min-max ()
|
||||
(with-test-sequences (seq '(4 5 3 2 0 4))
|
||||
(should (= (seq-min seq) 0))
|
||||
|
Loading…
Reference in New Issue
Block a user