Add take and ntake (bug#56521)

These are useful list primitives, complementary to `nthcdr`.

* src/fns.c (Ftake, Fntake): New.
(syms_of_fns): Defsubr them.
* doc/lispref/lists.texi (List Elements):
* lisp/emacs-lisp/shortdoc.el (list): Document.
* lisp/emacs-lisp/byte-opt.el (side-effect-free-fns, pure-fns):
Declare `take` pure and side-effect-free.
* test/src/fns-tests.el (fns-tests--take-ref, fns--take-ntake):
New test.
* etc/NEWS: Announce.
This commit is contained in:
Mattias Engdegård 2022-07-13 13:46:52 +02:00
parent 637436970f
commit d62766305a
6 changed files with 146 additions and 2 deletions

View file

@ -1459,7 +1459,7 @@ See Info node `(elisp) Integer Basics'."
symbol-function symbol-name symbol-plist symbol-value string-make-unibyte
string-make-multibyte string-as-multibyte string-as-unibyte
string-to-multibyte
tan time-convert truncate
take tan time-convert truncate
unibyte-char-to-multibyte upcase user-full-name
user-login-name user-original-login-name custom-variable-p
vconcat
@ -1560,7 +1560,7 @@ See Info node `(elisp) Integer Basics'."
;; arguments. This is pure enough for the purposes of
;; constant folding, but not necessarily for all kinds of
;; code motion.
car cdr car-safe cdr-safe nth nthcdr last
car cdr car-safe cdr-safe nth nthcdr last take
equal
length safe-length
memq memql member

View file

@ -595,6 +595,10 @@ A FUNC form can have any number of `:no-eval' (or `:no-value'),
:eval (nth 1 '(one two three)))
(nthcdr
:eval (nthcdr 1 '(one two three)))
(take
:eval (take 3 '(one two three four)))
(ntake
:eval (ntake 3 (list 'one 'two 'three 'four)))
(elt
:eval (elt '(one two three) 1))
(car-safe