1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-30 09:00:31 -08:00

Make 'mapconcat' argument 'separator' optional

* src/fns.c (Fmapconcat): Make third 'separator' argument
optional.  (Bug#50965)
* doc/lispref/functions.texi (Mapping Functions): Update
documentation for above change.
* test/src/fns-tests.el (fns-tests-mapconcat): New test.

* doc/misc/cl.texi (Obsolete Setf Customization): Don't use third
mapconcat argument in example.
* lisp/emacs-lisp/subr-x.el (string-join): Doc fix.
This commit is contained in:
Stefan Kangas 2021-10-05 15:36:31 +02:00
parent 4bf532ee82
commit d652efcd08
6 changed files with 35 additions and 9 deletions

View file

@ -961,14 +961,14 @@ side-effects only---the values it returns are ignored, not collected
into a list. @code{mapc} always returns @var{sequence}. into a list. @code{mapc} always returns @var{sequence}.
@end defun @end defun
@defun mapconcat function sequence separator @defun mapconcat function sequence &optional separator
@code{mapconcat} applies @var{function} to each element of @code{mapconcat} applies @var{function} to each element of
@var{sequence}; the results, which must be sequences of characters @var{sequence}; the results, which must be sequences of characters
(strings, vectors, or lists), are concatenated into a single string (strings, vectors, or lists), are concatenated into a single string
return value. Between each pair of result sequences, @code{mapconcat} return value. Between each pair of result sequences, @code{mapconcat}
inserts the characters from @var{separator}, which also must be a inserts the characters from @var{separator}, which also must be a
string, or a vector or list of characters. @xref{Sequences Arrays string, or a vector or list of characters; a @code{nil} value is
Vectors}. treated as the empty string. @xref{Sequences Arrays Vectors}.
The argument @var{function} must be a function that can take one The argument @var{function} must be a function that can take one
argument and returns a sequence of characters: a string, a vector, or argument and returns a sequence of characters: a string, a vector, or
@ -986,8 +986,7 @@ string.
@group @group
(mapconcat (lambda (x) (format "%c" (1+ x))) (mapconcat (lambda (x) (format "%c" (1+ x)))
"HAL-8000" "HAL-8000")
"")
@result{} "IBM.9111" @result{} "IBM.9111"
@end group @end group
@end example @end example

View file

@ -5030,7 +5030,7 @@ The above @code{incf} example could be written using
@ignore @ignore
(defmacro concatf (place &rest args) (defmacro concatf (place &rest args)
(gv-letplace (getter setter) place (gv-letplace (getter setter) place
(macroexp-let2 nil v (mapconcat 'identity args "") (macroexp-let2 nil v (mapconcat 'identity args)
(funcall setter `(concat ,getter ,v))))) (funcall setter `(concat ,getter ,v)))))
@end ignore @end ignore
@end defmac @end defmac

View file

@ -118,6 +118,10 @@ with recent versions of Firefox.
* Lisp Changes in Emacs 29.1 * Lisp Changes in Emacs 29.1
+++
** Third 'mapconcat' argument 'separator' is now optional.
An explicit nil always meant the empty string, now it can be left out.
--- ---
** Themes can now be made obsolete. ** Themes can now be made obsolete.
Using 'make-obsolete' on a theme is now supported. This will make Using 'make-obsolete' on a theme is now supported. This will make

View file

@ -208,7 +208,9 @@ The variable list SPEC is the same as in `if-let'."
(string= string "")) (string= string ""))
(defsubst string-join (strings &optional separator) (defsubst string-join (strings &optional separator)
"Join all STRINGS using SEPARATOR." "Join all STRINGS using SEPARATOR.
Optional argument SEPARATOR must be a string, a vector, or a list of
characters; nil stands for the empty string."
(mapconcat #'identity strings separator)) (mapconcat #'identity strings separator))
(define-obsolete-function-alias 'string-reverse 'reverse "25.1") (define-obsolete-function-alias 'string-reverse 'reverse "25.1")

View file

@ -2852,12 +2852,16 @@ mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq)
return leni; return leni;
} }
DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0, DEFUN ("mapconcat", Fmapconcat, Smapconcat, 2, 3, 0,
doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings. doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
In between each pair of results, stick in SEPARATOR. Thus, " " as In between each pair of results, stick in SEPARATOR. Thus, " " as
SEPARATOR results in spaces between the values returned by FUNCTION. SEPARATOR results in spaces between the values returned by FUNCTION.
SEQUENCE may be a list, a vector, a bool-vector, or a string. SEQUENCE may be a list, a vector, a bool-vector, or a string.
SEPARATOR must be a string, a vector, or a list of characters.
Optional argument SEPARATOR must be a string, a vector, or a list of
characters; nil stands for the empty string.
FUNCTION must be a function of one argument, and must return a value FUNCTION must be a function of one argument, and must return a value
that is a sequence of characters: either a string, or a vector or that is a sequence of characters: either a string, or a vector or
list of numbers that are valid character codepoints. */) list of numbers that are valid character codepoints. */)

View file

@ -430,6 +430,23 @@
(buffer-hash)) (buffer-hash))
(sha1 "foo")))) (sha1 "foo"))))
(ert-deftest fns-tests-mapconcat ()
(should (string= (mapconcat #'identity '()) ""))
(should (string= (mapconcat #'identity '("a" "b")) "ab"))
(should (string= (mapconcat #'identity '() "_") ""))
(should (string= (mapconcat #'identity '("A") "_") "A"))
(should (string= (mapconcat #'identity '("A" "B") "_") "A_B"))
(should (string= (mapconcat #'identity '("A" "B" "C") "_") "A_B_C"))
;; non-ASCII strings
(should (string= (mapconcat #'identity '("Ä" "ø" "" "தமிழ்") "_漢字_")
"Ä_漢字_ø_漢字_☭_漢字_தமிழ்"))
;; vector
(should (string= (mapconcat #'identity ["a" "b"] "") "ab"))
;; bool-vector
(should (string= (mapconcat #'identity [nil nil] "") ""))
(should-error (mapconcat #'identity [nil nil t])
:type 'wrong-type-argument))
(ert-deftest fns-tests-mapcan () (ert-deftest fns-tests-mapcan ()
(should-error (mapcan)) (should-error (mapcan))
(should-error (mapcan #'identity)) (should-error (mapcan #'identity))