comparison lisp/cl.el @ 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 6772ce4d982b
children 545ec923b4eb
comparison
equal deleted inserted replaced
4904:e91e3e353805 4995:8431b52e43b1
364 364
365 ;;; Sequence functions. 365 ;;; Sequence functions.
366 366
367 (defalias 'copy-seq 'copy-sequence) 367 (defalias 'copy-seq 'copy-sequence)
368 368
369 (defun mapcar* (cl-func cl-x &rest cl-rest)
370 "Apply FUNCTION to each element of SEQ, and make a list of the results.
371 If there are several SEQs, FUNCTION is called with that many arguments,
372 and mapping stops as soon as the shortest list runs out. With just one
373 SEQ, this is like `mapcar'. With several, it is like the Common Lisp
374 `mapcar' function extended to arbitrary sequence types."
375 (if cl-rest
376 (if (or (cdr cl-rest) (nlistp cl-x) (nlistp (car cl-rest)))
377 (cl-mapcar-many cl-func (cons cl-x cl-rest))
378 (let ((cl-res nil) (cl-y (car cl-rest)))
379 (while (and cl-x cl-y)
380 (push (funcall cl-func (pop cl-x) (pop cl-y)) cl-res))
381 (nreverse cl-res)))
382 (mapcar cl-func cl-x)))
383
384 (defalias 'svref 'aref) 369 (defalias 'svref 'aref)
385 370
386 ;;; List functions. 371 ;;; List functions.
387 372
388 ;; These functions are made known to the byte-compiler by cl-macs.el 373 ;; These functions are made known to the byte-compiler by cl-macs.el
636 (define-error 'cl-assertion-failed "Assertion failed") 621 (define-error 'cl-assertion-failed "Assertion failed")
637 622
638 ;; XEmacs change: omit the autoload rules; we handle those a different way 623 ;; XEmacs change: omit the autoload rules; we handle those a different way
639 624
640 ;;; Define data for indentation and edebug. 625 ;;; Define data for indentation and edebug.
641 (mapc-internal 626 (mapc
642 #'(lambda (entry) 627 #'(lambda (entry)
643 (mapc-internal 628 (mapc
644 #'(lambda (func) 629 #'(lambda (func)
645 (put func 'lisp-indent-function (nth 1 entry)) 630 (put func 'lisp-indent-function (nth 1 entry))
646 (put func 'lisp-indent-hook (nth 1 entry)) 631 (put func 'lisp-indent-hook (nth 1 entry))
647 (or (get func 'edebug-form-spec) 632 (or (get func 'edebug-form-spec)
648 (put func 'edebug-form-spec (nth 2 entry)))) 633 (put func 'edebug-form-spec (nth 2 entry))))