diff options
| author | Dmitry Antipov | 2014-05-15 18:59:02 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2014-05-15 18:59:02 +0400 |
| commit | ddc30c996a3d14e0163df6946ba96c9bcf73bd2f (patch) | |
| tree | 6c0a2fafa8a124e0c6e12174321dc012226bb7a9 /src | |
| parent | 92491099f710794ee2be60721fae50d68c5ca162 (diff) | |
| download | emacs-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/ChangeLog | 1 | ||||
| -rw-r--r-- | src/fns.c | 60 |
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 @@ | |||
| 1 | 2014-05-15 Dmitry Antipov <dmantipov@yandex.ru> | 1 | 2014-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 | ||
| 5 | 2014-05-14 Dmitry Antipov <dmantipov@yandex.ru> | 6 | 2014-05-14 Dmitry Antipov <dmantipov@yandex.ru> |
| 6 | 7 | ||
| @@ -1697,25 +1697,55 @@ changing the value of a sequence `foo'. */) | |||
| 1697 | } | 1697 | } |
| 1698 | 1698 | ||
| 1699 | DEFUN ("nreverse", Fnreverse, Snreverse, 1, 1, 0, | 1699 | DEFUN ("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. |
| 1701 | Return the reversed list. Expects a properly nil-terminated list. */) | 1701 | If SEQ is a list, it should be nil-terminated, and reversed |
| 1702 | (Lisp_Object list) | 1702 | by modifying cdr pointers. Return the reversed SEQ. |
| 1703 | |||
| 1704 | Note that unlike `reverse', this function doesn't work with strings. | ||
| 1705 | It 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 | ||
| 1721 | DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0, | 1751 | DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0, |