aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDmitry Antipov2014-05-15 18:59:02 +0400
committerDmitry Antipov2014-05-15 18:59:02 +0400
commitddc30c996a3d14e0163df6946ba96c9bcf73bd2f (patch)
tree6c0a2fafa8a124e0c6e12174321dc012226bb7a9 /src
parent92491099f710794ee2be60721fae50d68c5ca162 (diff)
downloademacs-ddc30c996a3d14e0163df6946ba96c9bcf73bd2f.tar.gz
emacs-ddc30c996a3d14e0163df6946ba96c9bcf73bd2f.zip
* src/fns.c (Fnreverse): Allow vectors and bool vectors.
* doc/lispref/lists.texi (Building Cons Cells and Lists): Remove description of `nreverse' and generalize it... * doc/lispref/sequences.texi (Sequences): ...for sequences here. * tests/automated/fns-tests.el (fns-tests-nreverse) (fns-tests-nreverse-bool-vector): New tests.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog1
-rw-r--r--src/fns.c60
2 files changed, 46 insertions, 15 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index ce51b26cf43..f82a6a298ae 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,6 +1,7 @@
12014-05-15 Dmitry Antipov <dmantipov@yandex.ru> 12014-05-15 Dmitry Antipov <dmantipov@yandex.ru>
2 2
3 * fns.c (Freverse): Allow vectors, bool vectors and strings. 3 * fns.c (Freverse): Allow vectors, bool vectors and strings.
4 (Fnreverse): Allow vectors and bool vectors.
4 5
52014-05-14 Dmitry Antipov <dmantipov@yandex.ru> 62014-05-14 Dmitry Antipov <dmantipov@yandex.ru>
6 7
diff --git a/src/fns.c b/src/fns.c
index 8f9734cd7cc..1694f1c798d 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -1697,25 +1697,55 @@ changing the value of a sequence `foo'. */)
1697} 1697}
1698 1698
1699DEFUN ("nreverse", Fnreverse, Snreverse, 1, 1, 0, 1699DEFUN ("nreverse", Fnreverse, Snreverse, 1, 1, 0,
1700 doc: /* Reverse LIST by modifying cdr pointers. 1700 doc: /* Reverse order of items in a list or vector SEQ.
1701Return the reversed list. Expects a properly nil-terminated list. */) 1701If SEQ is a list, it should be nil-terminated, and reversed
1702 (Lisp_Object list) 1702by modifying cdr pointers. Return the reversed SEQ.
1703
1704Note that unlike `reverse', this function doesn't work with strings.
1705It is strongly encouraged to treat them as immutable. */)
1706 (Lisp_Object seq)
1703{ 1707{
1704 register Lisp_Object prev, tail, next; 1708 if (NILP (seq))
1709 return seq;
1710 else if (CONSP (seq))
1711 {
1712 Lisp_Object prev, tail, next;
1705 1713
1706 if (NILP (list)) return list; 1714 for (prev = Qnil, tail = seq; !NILP (tail); tail = next)
1707 prev = Qnil; 1715 {
1708 tail = list; 1716 QUIT;
1709 while (!NILP (tail)) 1717 CHECK_LIST_CONS (tail, tail);
1718 next = XCDR (tail);
1719 Fsetcdr (tail, prev);
1720 prev = tail;
1721 }
1722 seq = prev;
1723 }
1724 else if (VECTORP (seq))
1710 { 1725 {
1711 QUIT; 1726 ptrdiff_t i, size = ASIZE (seq);
1712 CHECK_LIST_CONS (tail, tail); 1727
1713 next = XCDR (tail); 1728 for (i = 0; i < size / 2; i++)
1714 Fsetcdr (tail, prev); 1729 {
1715 prev = tail; 1730 Lisp_Object tem = AREF (seq, i);
1716 tail = next; 1731 ASET (seq, i, AREF (seq, size - i - 1));
1732 ASET (seq, size - i - 1, tem);
1733 }
1717 } 1734 }
1718 return prev; 1735 else if (BOOL_VECTOR_P (seq))
1736 {
1737 ptrdiff_t i, size = bool_vector_size (seq);
1738
1739 for (i = 0; i < size / 2; i++)
1740 {
1741 bool tem = bool_vector_bitref (seq, i);
1742 bool_vector_set (seq, i, bool_vector_bitref (seq, size - i - 1));
1743 bool_vector_set (seq, size - i - 1, tem);
1744 }
1745 }
1746 else
1747 wrong_type_argument (Qarrayp, seq);
1748 return seq;
1719} 1749}
1720 1750
1721DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0, 1751DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0,