comparison lisp/subr.el @ 5327:d1b17a33450b

Move the heavy lifting from cl-seq.el to C. src/ChangeLog addition: 2010-12-30 Aidan Kehoe <kehoea@parhasard.net> Move the heavy lifting from cl-seq.el to C, finally making those functions first-class XEmacs citizens, with circularity checking, built-in support for tests other than #'eql, and as much compatibility with current Common Lisp as Paul Dietz' tests require. * fns.c (check_eq_nokey, check_eq_key, check_eql_nokey) (check_eql_key, check_equal_nokey, check_equal_key) (check_equalp_nokey, check_equalp_key, check_string_match_nokey) (check_string_match_key, check_other_nokey, check_other_key) (check_if_nokey, check_if_key, check_match_eq_key) (check_match_eql_key, check_match_equal_key) (check_match_equalp_key, check_match_other_key): New. These are basically to provide function pointers to be used by Lisp functions that take TEST, TEST-NOT and KEY arguments. (get_check_match_function_1, get_check_test_function) (get_check_match_function): These functions work out which of the previous list of functions to use, given the keywords supplied by the user. (count_with_tail): New. This is the bones of #'count. (list_count_from_end, string_count_from_end): Utility functions for #'count. (Fcount): New, moved from cl-seq.el. (list_position_cons_before): New. The implementation of #'member*, and important in implementing various other functions. (FmemberX, Fadjoin, FassocX, FrassocX, Fposition, Ffind) (FdeleteX, FremoveX, Fdelete_duplicates, Fremove_duplicates) (Fnsubstitute, Fsubstitute, Fsublis, Fnsublis, Fsubst, Fnsubst) (Ftree_equal, Fmismatch, Fsearch, Fintersection, Fnintersection) (Fsubsetp, Fset_difference, Fnset_difference, Fnunion, Funion) (Fset_exclusive_or, Fnset_exclusive_or): New, moved here from cl-seq.el. (position): New. The implementation of #'find and #'position. (list_delete_duplicates_from_end, subst, sublis, nsublis) (tree_equal, mismatch_from_end, mismatch_list_list) (mismatch_list_string, mismatch_list_array) (mismatch_string_array, mismatch_string_string) (mismatch_array_array, get_mismatch_func): Helper C functions for the Lisp-visible functions. (venn, nvenn): New. The implementation of the main Lisp functions that treat lists as sets. lisp/ChangeLog addition: 2010-12-30 Aidan Kehoe <kehoea@parhasard.net> * cl-seq.el: Move the heavy lifting from this file to C. Dump the cl-parsing-keywords macro, but don't use defun* for the functions we define that do take keywords, dynamic scope lossage makes that not practical. * subr.el (sort, fillarray): Move these aliases here. (map-plist): #'nsublis is now built-in, but at this point #'eql isn't necessarily available as a test; use #'eq. * obsolete.el (cl-delete-duplicates): Make this available for old compiler macros and old code. (memql): Document that this is equivalent to #'member*, and worse. * cl.el (adjoin, subst): Removed. These are in C.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 30 Dec 2010 01:59:52 +0000
parents 57a64ab2ae45
children 8608eadee6ba 89331fa1c819
comparison
equal deleted inserted replaced
5323:f87bb35a6b94 5327:d1b17a33450b
224 (define-function 'send-string-to-terminal 'external-debugging-output) 224 (define-function 'send-string-to-terminal 'external-debugging-output)
225 (define-function 'special-form-p 'special-operator-p) 225 (define-function 'special-form-p 'special-operator-p)
226 226
227 ;; XEmacs; this is in Lisp, its bytecode now taken by subseq. 227 ;; XEmacs; this is in Lisp, its bytecode now taken by subseq.
228 (define-function 'substring 'subseq) 228 (define-function 'substring 'subseq)
229
230 (define-function 'sort 'sort*)
231 (define-function 'fillarray 'fill)
229 232
230 ;; XEmacs: 233 ;; XEmacs:
231 (defun local-variable-if-set-p (sym buffer) 234 (defun local-variable-if-set-p (sym buffer)
232 "Return t if SYM would be local to BUFFER after it is set. 235 "Return t if SYM would be local to BUFFER after it is set.
233 A nil value for BUFFER is *not* the same as (current-buffer), but 236 A nil value for BUFFER is *not* the same as (current-buffer), but
1102 ((macro 1105 ((macro
1103 . (lambda (map-plist-definition) 1106 . (lambda (map-plist-definition)
1104 "Replace the variable names in MAP-PLIST-DEFINITION with uninterned 1107 "Replace the variable names in MAP-PLIST-DEFINITION with uninterned
1105 symbols, avoiding the risk of interference with variables in other functions 1108 symbols, avoiding the risk of interference with variables in other functions
1106 introduced by dynamic scope." 1109 introduced by dynamic scope."
1107 (if-fboundp 'nsublis 1110 (nsublis '((mp-function . #:function)
1108 (nsublis 1111 (plist . #:plist)
1109 '((mp-function . #:function) 1112 (result . #:result))
1110 (plist . #:plist) 1113 ;; Need to specify #'eq as the test, otherwise we have a
1111 (result . #:result)) 1114 ;; bootstrap issue, since #'eql is in cl.el, loaded after
1112 map-plist-definition) 1115 ;; this file.
1113 map-plist-definition))) 1116 map-plist-definition :test #'eq)))
1114 (defun map-plist (mp-function plist) 1117 (defun map-plist (mp-function plist)
1115 "Map FUNCTION (a function of two args) over each key/value pair in PLIST. 1118 "Map FUNCTION (a function of two args) over each key/value pair in PLIST.
1116 Return a list of the results." 1119 Return a list of the results."
1117 (let (result) 1120 (let (result)
1118 (while plist 1121 (while plist