1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-24 07:20:37 +00: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}.
@end defun
@defun mapconcat function sequence separator
@defun mapconcat function sequence &optional separator
@code{mapconcat} applies @var{function} to each element of
@var{sequence}; the results, which must be sequences of characters
(strings, vectors, or lists), are concatenated into a single string
return value. Between each pair of result sequences, @code{mapconcat}
inserts the characters from @var{separator}, which also must be a
string, or a vector or list of characters. @xref{Sequences Arrays
Vectors}.
string, or a vector or list of characters; a @code{nil} value is
treated as the empty string. @xref{Sequences Arrays Vectors}.
The argument @var{function} must be a function that can take one
argument and returns a sequence of characters: a string, a vector, or
@ -986,8 +986,7 @@ string.
@group
(mapconcat (lambda (x) (format "%c" (1+ x)))
"HAL-8000"
"")
"HAL-8000")
@result{} "IBM.9111"
@end group
@end example

View File

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

View File

@ -118,6 +118,10 @@ with recent versions of Firefox.
* 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.
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 ""))
(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))
(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;
}
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.
In between each pair of results, stick in SEPARATOR. Thus, " " as
SEPARATOR results in spaces between the values returned by FUNCTION.
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
that is a sequence of characters: either a string, or a vector or
list of numbers that are valid character codepoints. */)

View File

@ -430,6 +430,23 @@
(buffer-hash))
(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 ()
(should-error (mapcan))
(should-error (mapcan #'identity))