From 727c335ead7d9fb09c82ea742fcb4839dfc9055f Mon Sep 17 00:00:00 2001 From: Graham Dobbins Date: Mon, 27 Feb 2017 13:29:34 -0500 Subject: [PATCH] Open-code numberp and markerp and = calls in length= * src/fns.c (length_eqlsign2, Flength_eqlsign): Add example to docstring and open-code calls to numberp and markerp and =. --- etc/NEWS | 1 - src/fns.c | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 642f1fdcfc..16a48ef188 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -975,7 +975,6 @@ that does not exist. operating recursively and when some other process deletes the directory or its files before 'delete-directory' gets to them. -+++ ** The new function 'length=' compares the lengths of sequences and numbers. diff --git a/src/fns.c b/src/fns.c index b0247c81c4..78a9353b27 100644 --- a/src/fns.c +++ b/src/fns.c @@ -143,12 +143,12 @@ length_eqlsign2 (Lisp_Object s1, Lisp_Object s2) { Lisp_Object val = Qnil; - if (Fnumber_or_marker_p (s1)) + if (NUMBERP (s1) || MARKERP (s1)) CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (s1); else if (! CONSP (s1)) s1 = Flength (s1); - if (Fnumber_or_marker_p (s2)) + if (NUMBERP (s2) || MARKERP (s2)) CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (s2); else if (! CONSP (s2)) s2 = Flength (s2); @@ -221,6 +221,8 @@ DEFUN ("length=", Flength_eqlsign, Slength_eqlsign, 1, MANY, 0, doc: /* Each element of SEQUENCES may be any type accepted by `length' or `='. True if the length of each sequence is equal to each number, otherwise returns nil. + +For example (length= 2 \\='(1 2) [3 4]) returns t. usage: (length= &rest SEQUENCES) */) (ptrdiff_t nargs, Lisp_Object *args) { @@ -229,6 +231,7 @@ usage: (length= &rest SEQUENCES) */) return length_eqlsign2 (args[0], args[1]); Lisp_Object val = Qnil; + double val_n = 0; Lisp_Object temp_list = Qnil; ptrdiff_t temp_list_i = 0; @@ -237,14 +240,21 @@ usage: (length= &rest SEQUENCES) */) inconsistency found. */ for (ptrdiff_t argnum = 0; argnum < nargs; argnum++) { - if (Fnumber_or_marker_p (args[argnum])) + if (NUMBERP (args[argnum]) || MARKERP (args[argnum])) { if (NILP (val)) { val = args[argnum]; CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val); + val_n = FLOATP (val) ? XFLOAT_DATA (val) : XINT (val); + } + else if (FLOATP (args[argnum])) + { + double f1 = XFLOAT_DATA (args[argnum]); + if (f1 != val_n) + return Qnil; } - else if (! CALLN (Feqlsign, val, args[argnum])) + else if (XINT (args[argnum]) != val_n) return Qnil; args[argnum] = Qnil; -- 2.11.1