comparison src/lisp.h @ 4995:8431b52e43b1

Move the various map* functions to C; add #'map-into. src/ChangeLog addition: 2010-01-31 Aidan Kehoe <kehoea@parhasard.net> Move #'mapcar*, #'mapcan, #'mapc, #'map, #'mapl, #'mapcon to C; extend #'mapvector, #'mapconcat, #'mapcar to support more SEQUENCES; have them all error with circular lists. * fns.c (Fsubseq): Call CHECK_SEQUENCE here; Flength can return from the debugger if it errors with a non-sequence, leading to a crash in Fsubseq if sequence really is *not* a sequence. (mapcarX): Rename mapcar1 to mapcarX; rework it comprehensively to take an optional lisp output argument, and a varying number of sequences. Special-case a single list argument, as we used to, saving its elements in the stack space for the results before calling FUNCTION, so FUNCTION can corrupt the list all it wants. dead_wrong_type_argument() in the other cases if we encounter a non-cons where we expected a cons. (Fmapconcat): Accept further SEQUENCES after separator here. Special-case the idiom (mapconcat 'identity SEQUENCE), don't even funcall. (FmapcarX): Rename this from Fmapcar. Accept optional SEQUENCES. (Fmapvector): Accept optional SEQUENCES. (Fmapcan, Fmapc, Fmap): Move these here from cl-extra.el. (Fmap_into): New function, as specified by Common Lisp. (maplist): New function, the guts of the implementation of Fmaplist and Fmapl. (Fmaplist, Fmapl, Fmapcon): Move these from cl-extra.el. (syms_of_fns): Add a few needed symbols here, for the type tests used by #'map. Add the new subrs, with aliases for #'mapc-internal and #'mapcar. * general-slots.h: Declare Qcoerce here, now it's used in both indent.c and fns.c * indent.c (syms_of_indent): Qcoerce is gone from here. * lisp.h: Add ARRAYP(), SEQUENCEP(), and the corresponding CHECK_* macros. Declare Fbit_vector, Fstring, FmapcarX, now other files need to use them. * data.c (Farrayp, Fsequencep): Use ARRAYP and SEQUENCEP, just added to lisp.h * buffer.c (Fbuffer_list): Now Fmapcar has been renamed FmapcarX and takes MANY arguments, update this function to reflect that. lisp/ChangeLog addition: 2010-01-31 Aidan Kehoe <kehoea@parhasard.net> * cl.el (mapcar*): Delete; this is now in fns.c. Use #'mapc, not #'mapc-internal in a couple of places. * cl-macs.el (mapc, mapcar*, map): Delete these compiler macros now the corresponding functions are in fns.c; there's no run-time advantage to the macros. * cl-extra.el (coerce): Extend the possible conversions here a little; it's not remotely comprehensive yet, though it does allow running slightly more Common Lisp code than previously. (cl-mapcar-many): Delete. (map, maplist, mapc, mapl, mapcan, mapcon): Move these to fns.c. * bytecomp.el (byte-compile-maybe-mapc): Use #'mapc itself, not #'mapc-internal, now the former is in C. (mapcar*): Use #'byte-compile-maybe-mapc as this function's byte-compile method, now a #'mapc that can take more than one sequence is in C. * obsolete.el (cl-mapc): Move this compatibility alias to this file. * update-elc.el (do-autoload-commands): Use #'mapc, not #'mapc-internal here.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 31 Jan 2010 18:29:48 +0000
parents c27efc9acb5a
children c17c857e20bf
comparison
equal deleted inserted replaced
4904:e91e3e353805 4995:8431b52e43b1
2961 #define DECLARE_INLINE_LISP_BIT_VECTOR(numbits) struct { \ 2961 #define DECLARE_INLINE_LISP_BIT_VECTOR(numbits) struct { \
2962 struct LCRECORD_HEADER lheader; \ 2962 struct LCRECORD_HEADER lheader; \
2963 Elemcount size; \ 2963 Elemcount size; \
2964 unsigned long bits[BIT_VECTOR_LONG_STORAGE(numbits)]; \ 2964 unsigned long bits[BIT_VECTOR_LONG_STORAGE(numbits)]; \
2965 } 2965 }
2966 /*---------------------- array, sequence -----------------------------*/
2967
2968 #define ARRAYP(x) (VECTORP (x) || STRINGP (x) || BIT_VECTORP (x))
2969
2970 #define CHECK_ARRAY(x) do { \
2971 if (!ARRAYP (x)) \
2972 dead_wrong_type_argument (Qarrayp, x); \
2973 } while (0)
2974
2975 #define CONCHECK_ARRAY(x) do { \
2976 if (!ARRAYP (x)) \
2977 x = wrong_type_argument (Qarrayp, x); \
2978 } while (0)
2979
2980 #define SEQUENCEP(x) (LISTP (x) || ARRAYP (x))
2981
2982 #define CHECK_SEQUENCE(x) do { \
2983 if (!SEQUENCEP (x)) \
2984 dead_wrong_type_argument (Qsequencep, x); \
2985 } while (0)
2986
2987 #define CONCHECK_SEQUENCE(x) do { \
2988 if (!SEQUENCEP (x)) \
2989 x = wrong_type_argument (Qsequencep, x); \
2990 } while (0)
2966 2991
2967 /*------------------------------ symbol --------------------------------*/ 2992 /*------------------------------ symbol --------------------------------*/
2968 2993
2969 typedef struct Lisp_Symbol Lisp_Symbol; 2994 typedef struct Lisp_Symbol Lisp_Symbol;
2970 struct Lisp_Symbol 2995 struct Lisp_Symbol
4223 MODULE_API EXFUN (Fexpand_abbrev, 0); 4248 MODULE_API EXFUN (Fexpand_abbrev, 0);
4224 4249
4225 /* Defined in alloc.c */ 4250 /* Defined in alloc.c */
4226 MODULE_API EXFUN (Fcons, 2); 4251 MODULE_API EXFUN (Fcons, 2);
4227 MODULE_API EXFUN (Flist, MANY); 4252 MODULE_API EXFUN (Flist, MANY);
4253 EXFUN (Fbit_vector, MANY);
4228 EXFUN (Fmake_byte_code, MANY); 4254 EXFUN (Fmake_byte_code, MANY);
4229 MODULE_API EXFUN (Fmake_list, 2); 4255 MODULE_API EXFUN (Fmake_list, 2);
4230 MODULE_API EXFUN (Fmake_string, 2); 4256 MODULE_API EXFUN (Fmake_string, 2);
4257 EXFUN (Fstring, MANY);
4231 MODULE_API EXFUN (Fmake_symbol, 1); 4258 MODULE_API EXFUN (Fmake_symbol, 1);
4232 MODULE_API EXFUN (Fmake_vector, 2); 4259 MODULE_API EXFUN (Fmake_vector, 2);
4233 MODULE_API EXFUN (Fvector, MANY); 4260 MODULE_API EXFUN (Fvector, MANY);
4234 4261
4235 #ifndef NEW_GC 4262 #ifndef NEW_GC
5049 MODULE_API EXFUN (Fget, 3); 5076 MODULE_API EXFUN (Fget, 3);
5050 EXFUN (Flast, 2); 5077 EXFUN (Flast, 2);
5051 EXFUN (Flax_plist_get, 3); 5078 EXFUN (Flax_plist_get, 3);
5052 EXFUN (Flax_plist_remprop, 2); 5079 EXFUN (Flax_plist_remprop, 2);
5053 MODULE_API EXFUN (Flength, 1); 5080 MODULE_API EXFUN (Flength, 1);
5054 EXFUN (Fmapcar, 2); 5081 EXFUN (FmapcarX, MANY);
5055 EXFUN (Fmember, 2); 5082 EXFUN (Fmember, 2);
5056 EXFUN (Fmemq, 2); 5083 EXFUN (Fmemq, 2);
5057 EXFUN (Fnconc, MANY); 5084 EXFUN (Fnconc, MANY);
5058 MODULE_API EXFUN (Fnreverse, 1); 5085 MODULE_API EXFUN (Fnreverse, 1);
5059 EXFUN (Fnthcdr, 2); 5086 EXFUN (Fnthcdr, 2);