]> git.eshelyaron.com Git - emacs.git/commitdiff
Accept bignum arguments in `take` and `ntake`
authorMattias Engdegård <mattiase@acm.org>
Tue, 30 Aug 2022 14:44:51 +0000 (16:44 +0200)
committerMattias Engdegård <mattiase@acm.org>
Tue, 30 Aug 2022 14:48:25 +0000 (16:48 +0200)
* src/fns.c (Ftake, Fntake): Accept any integer as first argument, for
completeness.
* test/src/fns-tests.el (fns--take-ntake): Add test cases.

src/fns.c
test/src/fns-tests.el

index 7e78bba3a040eb6ad3bc6905c66697ce69a521c2..07102256fede80b90415862fbae66b9cbf078ec6 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -1563,7 +1563,15 @@ If N is zero or negative, return nil.
 If N is greater or equal to the length of LIST, return LIST (or a copy).  */)
   (Lisp_Object n, Lisp_Object list)
 {
-  CHECK_FIXNUM (n);
+  if (BIGNUMP (n))
+    {
+      if (mpz_sgn (*xbignum_val (n)) < 0)
+       return Qnil;
+      CHECK_LIST (list);
+      return list;
+    }
+  if (!FIXNUMP (n))
+    wrong_type_argument (Qintegerp, n);
   EMACS_INT m = XFIXNUM (n);
   if (m <= 0)
     return Qnil;
@@ -1594,7 +1602,15 @@ If N is greater or equal to the length of LIST, return LIST unmodified.
 Otherwise, return LIST after truncating it.  */)
   (Lisp_Object n, Lisp_Object list)
 {
-  CHECK_FIXNUM (n);
+  if (BIGNUMP (n))
+    {
+      if (mpz_sgn (*xbignum_val (n)) < 0)
+       return Qnil;
+      CHECK_LIST (list);
+      return list;
+    }
+  if (!FIXNUMP (n))
+    wrong_type_argument (Qintegerp, n);
   EMACS_INT m = XFIXNUM (n);
   if (m <= 0)
     return Qnil;
index a84cce3ad4e7424c7e88a701abf9c8028940e391..4ef428af03ea7951fe065cb16e995b5d38470591 100644 (file)
     (should (equal (take 5 list) '(a b c b c)))
     (should (equal (take 10 list) '(a b c b c b c b c b)))
 
-    (should (equal (ntake 10 list) '(a b)))))
+    (should (equal (ntake 10 list) '(a b))))
+
+  ;; Bignum N argument.
+  (let ((list (list 'a 'b 'c)))
+    (should (equal (take (+ most-positive-fixnum 1) list) '(a b c)))
+    (should (equal (take (- most-negative-fixnum 1) list) nil))
+    (should (equal (ntake (+ most-positive-fixnum 1) list) '(a b c)))
+    (should (equal (ntake (- most-negative-fixnum 1) list) nil))
+    (should (equal list '(a b c)))))
 
 ;;; fns-tests.el ends here