comparison src/fns.c @ 5374:d967d96ca043

Conditionalise the old-* functions and byte codes at compile time. src/ChangeLog addition: 2011-03-15 Aidan Kehoe <kehoea@parhasard.net> * config.h.in (SUPPORT_CONFOUNDING_FUNCTIONS): New #define, equivalent NEED_TO_HANDLE_21_4_CODE by default, describing whether this XEmacs should support the old-eq, old-equal and related functions and byte codes. * bytecode.c (UNUSED): Only interpret old-eq, old-equal, old-memq if SUPPORT_CONFOUNDING_FUNCTIONS is defined. * data.c: Move Fold_eq to fns.c with the rest of the Fold_* functions. * fns.c: * fns.c (Fmemq): * fns.c (memq_no_quit): * fns.c (assoc_no_quit): * fns.c (Frassq): * fns.c (Fequal): * fns.c (Fold_equal): * fns.c (syms_of_fns): Group old-eq, old-equal, old-memq etc together, surround them with #ifdef SUPPORT_CONFOUNDING_FUNCTIONS. lisp/ChangeLog addition: 2011-03-15 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el: Don't generate the old-eq, old-memq, old-equal bytecodes any more, but keep the information about them around for the sake of the disassembler. man/ChangeLog addition: 2011-03-15 Aidan Kehoe <kehoea@parhasard.net> * lispref/objects.texi (Character Type): * lispref/objects.texi (Equality Predicates): No longer document `old-eq', `old-equal', they haven't been used in years. tests/ChangeLog addition: 2011-03-17 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: Only test the various old-* function if old-eq is bound and a subr.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 17 Mar 2011 20:13:00 +0000
parents 46b53e84ea7a
children e99b473303e3 ac37a5f7e5be
comparison
equal deleted inserted replaced
5372:6c3a695f54f5 5374:d967d96ca043
70 Lisp_Object Vpath_separator; 70 Lisp_Object Vpath_separator;
71 71
72 extern Fixnum max_lisp_eval_depth; 72 extern Fixnum max_lisp_eval_depth;
73 extern int lisp_eval_depth; 73 extern int lisp_eval_depth;
74 74
75 static int internal_old_equal (Lisp_Object, Lisp_Object, int);
76 Lisp_Object safe_copy_tree (Lisp_Object arg, Lisp_Object vecp, int depth); 75 Lisp_Object safe_copy_tree (Lisp_Object arg, Lisp_Object vecp, int depth);
77 76
78 static DOESNT_RETURN 77 static DOESNT_RETURN
79 mapping_interaction_error (Lisp_Object func, Lisp_Object object) 78 mapping_interaction_error (Lisp_Object func, Lisp_Object object)
80 { 79 {
2579 return tail; 2578 return tail;
2580 } 2579 }
2581 return Qnil; 2580 return Qnil;
2582 } 2581 }
2583 2582
2584 DEFUN ("old-member", Fold_member, 2, 2, 0, /*
2585 Return non-nil if ELT is an element of LIST. Comparison done with `old-equal'.
2586 The value is actually the tail of LIST whose car is ELT.
2587 This function is provided only for byte-code compatibility with v19.
2588 Do not use it.
2589 */
2590 (elt, list))
2591 {
2592 EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
2593 {
2594 if (internal_old_equal (elt, list_elt, 0))
2595 return tail;
2596 }
2597 return Qnil;
2598 }
2599
2600 DEFUN ("memq", Fmemq, 2, 2, 0, /* 2583 DEFUN ("memq", Fmemq, 2, 2, 0, /*
2601 Return non-nil if ELT is an element of LIST. Comparison done with `eq'. 2584 Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
2602 The value is actually the tail of LIST whose car is ELT. 2585 The value is actually the tail of LIST whose car is ELT.
2603 */ 2586 */
2604 (elt, list)) 2587 (elt, list))
2605 { 2588 {
2606 EXTERNAL_LIST_LOOP_3 (list_elt, list, tail) 2589 EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
2607 { 2590 {
2608 if (EQ_WITH_EBOLA_NOTICE (elt, list_elt)) 2591 if (EQ_WITH_EBOLA_NOTICE (elt, list_elt))
2609 return tail;
2610 }
2611 return Qnil;
2612 }
2613
2614 DEFUN ("old-memq", Fold_memq, 2, 2, 0, /*
2615 Return non-nil if ELT is an element of LIST. Comparison done with `old-eq'.
2616 The value is actually the tail of LIST whose car is ELT.
2617 This function is provided only for byte-code compatibility with v19.
2618 Do not use it.
2619 */
2620 (elt, list))
2621 {
2622 EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
2623 {
2624 if (HACKEQ_UNSAFE (elt, list_elt))
2625 return tail; 2592 return tail;
2626 } 2593 }
2627 return Qnil; 2594 return Qnil;
2628 } 2595 }
2629 2596
2820 return elt; 2787 return elt;
2821 } 2788 }
2822 return Qnil; 2789 return Qnil;
2823 } 2790 }
2824 2791
2825 DEFUN ("old-assoc", Fold_assoc, 2, 2, 0, /*
2826 Return non-nil if KEY is `old-equal' to the car of an element of ALIST.
2827 The value is actually the element of ALIST whose car equals KEY.
2828 */
2829 (key, alist))
2830 {
2831 /* This function can GC. */
2832 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
2833 {
2834 if (internal_old_equal (key, elt_car, 0))
2835 return elt;
2836 }
2837 return Qnil;
2838 }
2839
2840 Lisp_Object 2792 Lisp_Object
2841 assoc_no_quit (Lisp_Object key, Lisp_Object alist) 2793 assoc_no_quit (Lisp_Object key, Lisp_Object alist)
2842 { 2794 {
2843 int speccount = specpdl_depth (); 2795 int speccount = specpdl_depth ();
2844 specbind (Qinhibit_quit, Qt); 2796 specbind (Qinhibit_quit, Qt);
2853 (key, alist)) 2805 (key, alist))
2854 { 2806 {
2855 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) 2807 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
2856 { 2808 {
2857 if (EQ_WITH_EBOLA_NOTICE (key, elt_car)) 2809 if (EQ_WITH_EBOLA_NOTICE (key, elt_car))
2858 return elt;
2859 }
2860 return Qnil;
2861 }
2862
2863 DEFUN ("old-assq", Fold_assq, 2, 2, 0, /*
2864 Return non-nil if KEY is `old-eq' to the car of an element of ALIST.
2865 The value is actually the element of ALIST whose car is KEY.
2866 Elements of ALIST that are not conses are ignored.
2867 This function is provided only for byte-code compatibility with v19.
2868 Do not use it.
2869 */
2870 (key, alist))
2871 {
2872 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
2873 {
2874 if (HACKEQ_UNSAFE (key, elt_car))
2875 return elt; 2810 return elt;
2876 } 2811 }
2877 return Qnil; 2812 return Qnil;
2878 } 2813 }
2879 2814
2953 (value, alist)) 2888 (value, alist))
2954 { 2889 {
2955 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist) 2890 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
2956 { 2891 {
2957 if (internal_equal (value, elt_cdr, 0)) 2892 if (internal_equal (value, elt_cdr, 0))
2958 return elt;
2959 }
2960 return Qnil;
2961 }
2962
2963 DEFUN ("old-rassoc", Fold_rassoc, 2, 2, 0, /*
2964 Return non-nil if VALUE is `old-equal' to the cdr of an element of ALIST.
2965 The value is actually the element of ALIST whose cdr equals VALUE.
2966 */
2967 (value, alist))
2968 {
2969 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
2970 {
2971 if (internal_old_equal (value, elt_cdr, 0))
2972 return elt; 2893 return elt;
2973 } 2894 }
2974 return Qnil; 2895 return Qnil;
2975 } 2896 }
2976 2897
3276 test, key, start, end, from_end, default_, Qposition); 3197 test, key, start, end, from_end, default_, Qposition);
3277 3198
3278 return object; 3199 return object;
3279 } 3200 }
3280 3201
3281 DEFUN ("old-delete", Fold_delete, 2, 2, 0, /*
3282 Delete by side effect any occurrences of ELT as a member of LIST.
3283 The modified LIST is returned. Comparison is done with `old-equal'.
3284 If the first member of LIST is ELT, there is no way to remove it by side
3285 effect; therefore, write `(setq foo (old-delete element foo))' to be sure
3286 of changing the value of `foo'.
3287 */
3288 (elt, list))
3289 {
3290 EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
3291 (internal_old_equal (elt, list_elt, 0)));
3292 return list;
3293 }
3294
3295 DEFUN ("old-delq", Fold_delq, 2, 2, 0, /*
3296 Delete by side effect any occurrences of ELT as a member of LIST.
3297 The modified LIST is returned. Comparison is done with `old-eq'.
3298 If the first member of LIST is ELT, there is no way to remove it by side
3299 effect; therefore, write `(setq foo (old-delq element foo))' to be sure of
3300 changing the value of `foo'.
3301 */
3302 (elt, list))
3303 {
3304 EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
3305 (HACKEQ_UNSAFE (elt, list_elt)));
3306 return list;
3307 }
3308
3309 /* Like Fdelq, but caller must ensure that LIST is properly 3202 /* Like Fdelq, but caller must ensure that LIST is properly
3310 nil-terminated and ebola-free. */ 3203 nil-terminated and ebola-free. */
3311 3204
3312 Lisp_Object 3205 Lisp_Object
3313 delq_no_quit (Lisp_Object elt, Lisp_Object list) 3206 delq_no_quit (Lisp_Object elt, Lisp_Object list)
6535 return internal_equalp (obj1, obj2, depth); 6428 return internal_equalp (obj1, obj2, depth);
6536 else 6429 else
6537 return internal_equal (obj1, obj2, depth); 6430 return internal_equal (obj1, obj2, depth);
6538 } 6431 }
6539 6432
6433 DEFUN ("equal", Fequal, 2, 2, 0, /*
6434 Return t if two Lisp objects have similar structure and contents.
6435 They must have the same data type.
6436 Conses are compared by comparing the cars and the cdrs.
6437 Vectors and strings are compared element by element.
6438 Numbers are compared by value. Symbols must match exactly.
6439 */
6440 (object1, object2))
6441 {
6442 return internal_equal (object1, object2, 0) ? Qt : Qnil;
6443 }
6444
6445 DEFUN ("equalp", Fequalp, 2, 2, 0, /*
6446 Return t if two Lisp objects have similar structure and contents.
6447
6448 This is like `equal', except that it accepts numerically equal
6449 numbers of different types (float, integer, bignum, bigfloat), and also
6450 compares strings and characters case-insensitively.
6451
6452 Type objects that are arrays (that is, strings, bit-vectors, and vectors)
6453 of the same length and with contents that are `equalp' are themselves
6454 `equalp', regardless of whether the two objects have the same type.
6455
6456 Other objects whose primary purpose is as containers of other objects are
6457 `equalp' if they would otherwise be equal (same length, type, etc.) and
6458 their contents are `equalp'. This goes for conses, weak lists,
6459 weak boxes, ephemerons, specifiers, hash tables, char tables and range
6460 tables. However, objects that happen to contain other objects but are not
6461 primarily designed for this purpose (e.g. compiled functions, events or
6462 display-related objects such as glyphs, faces or extents) are currently
6463 compared using `equalp' the same way as using `equal'.
6464
6465 More specifically, two hash tables are `equalp' if they have the same test
6466 (see `hash-table-test'), the same number of entries, and the same value for
6467 `hash-table-weakness', and if, for each entry in one hash table, its key is
6468 equivalent to a key in the other hash table using the hash table test, and
6469 its value is `equalp' to the other hash table's value for that key.
6470 */
6471 (object1, object2))
6472 {
6473 return internal_equalp (object1, object2, 0) ? Qt : Qnil;
6474 }
6475
6476 #ifdef SUPPORT_CONFOUNDING_FUNCTIONS
6477
6540 /* Note that we may be calling sub-objects that will use 6478 /* Note that we may be calling sub-objects that will use
6541 internal_equal() (instead of internal_old_equal()). Oh well. 6479 internal_equal() (instead of internal_old_equal()). Oh well.
6542 We will get an Ebola note if there's any possibility of confusion, 6480 We will get an Ebola note if there's any possibility of confusion,
6543 but that seems unlikely. */ 6481 but that seems unlikely. */
6544 6482
6555 return 0; 6493 return 0;
6556 6494
6557 return internal_equal (obj1, obj2, depth); 6495 return internal_equal (obj1, obj2, depth);
6558 } 6496 }
6559 6497
6560 DEFUN ("equal", Fequal, 2, 2, 0, /* 6498 DEFUN ("old-member", Fold_member, 2, 2, 0, /*
6561 Return t if two Lisp objects have similar structure and contents. 6499 Return non-nil if ELT is an element of LIST. Comparison done with `old-equal'.
6562 They must have the same data type. 6500 The value is actually the tail of LIST whose car is ELT.
6563 Conses are compared by comparing the cars and the cdrs. 6501 This function is provided only for byte-code compatibility with v19.
6564 Vectors and strings are compared element by element. 6502 Do not use it.
6565 Numbers are compared by value. Symbols must match exactly. 6503 */
6566 */ 6504 (elt, list))
6567 (object1, object2)) 6505 {
6568 { 6506 EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
6569 return internal_equal (object1, object2, 0) ? Qt : Qnil; 6507 {
6570 } 6508 if (internal_old_equal (elt, list_elt, 0))
6571 6509 return tail;
6572 DEFUN ("equalp", Fequalp, 2, 2, 0, /* 6510 }
6573 Return t if two Lisp objects have similar structure and contents. 6511 return Qnil;
6574 6512 }
6575 This is like `equal', except that it accepts numerically equal 6513
6576 numbers of different types (float, integer, bignum, bigfloat), and also 6514 DEFUN ("old-memq", Fold_memq, 2, 2, 0, /*
6577 compares strings and characters case-insensitively. 6515 Return non-nil if ELT is an element of LIST. Comparison done with `old-eq'.
6578 6516 The value is actually the tail of LIST whose car is ELT.
6579 Type objects that are arrays (that is, strings, bit-vectors, and vectors) 6517 This function is provided only for byte-code compatibility with v19.
6580 of the same length and with contents that are `equalp' are themselves 6518 Do not use it.
6581 `equalp', regardless of whether the two objects have the same type. 6519 */
6582 6520 (elt, list))
6583 Other objects whose primary purpose is as containers of other objects are 6521 {
6584 `equalp' if they would otherwise be equal (same length, type, etc.) and 6522 EXTERNAL_LIST_LOOP_3 (list_elt, list, tail)
6585 their contents are `equalp'. This goes for conses, weak lists, 6523 {
6586 weak boxes, ephemerons, specifiers, hash tables, char tables and range 6524 if (HACKEQ_UNSAFE (elt, list_elt))
6587 tables. However, objects that happen to contain other objects but are not 6525 return tail;
6588 primarily designed for this purpose (e.g. compiled functions, events or 6526 }
6589 display-related objects such as glyphs, faces or extents) are currently 6527 return Qnil;
6590 compared using `equalp' the same way as using `equal'. 6528 }
6591 6529
6592 More specifically, two hash tables are `equalp' if they have the same test 6530 DEFUN ("old-assoc", Fold_assoc, 2, 2, 0, /*
6593 (see `hash-table-test'), the same number of entries, and the same value for 6531 Return non-nil if KEY is `old-equal' to the car of an element of ALIST.
6594 `hash-table-weakness', and if, for each entry in one hash table, its key is 6532 The value is actually the element of ALIST whose car equals KEY.
6595 equivalent to a key in the other hash table using the hash table test, and 6533 */
6596 its value is `equalp' to the other hash table's value for that key. 6534 (key, alist))
6597 */ 6535 {
6598 (object1, object2)) 6536 /* This function can GC. */
6599 { 6537 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
6600 return internal_equalp (object1, object2, 0) ? Qt : Qnil; 6538 {
6539 if (internal_old_equal (key, elt_car, 0))
6540 return elt;
6541 }
6542 return Qnil;
6543 }
6544
6545 DEFUN ("old-assq", Fold_assq, 2, 2, 0, /*
6546 Return non-nil if KEY is `old-eq' to the car of an element of ALIST.
6547 The value is actually the element of ALIST whose car is KEY.
6548 Elements of ALIST that are not conses are ignored.
6549 This function is provided only for byte-code compatibility with v19.
6550 Do not use it.
6551 */
6552 (key, alist))
6553 {
6554 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
6555 {
6556 if (HACKEQ_UNSAFE (key, elt_car))
6557 return elt;
6558 }
6559 return Qnil;
6560 }
6561
6562 DEFUN ("old-rassoc", Fold_rassoc, 2, 2, 0, /*
6563 Return non-nil if VALUE is `old-equal' to the cdr of an element of ALIST.
6564 The value is actually the element of ALIST whose cdr equals VALUE.
6565 */
6566 (value, alist))
6567 {
6568 EXTERNAL_ALIST_LOOP_4 (elt, elt_car, elt_cdr, alist)
6569 {
6570 if (internal_old_equal (value, elt_cdr, 0))
6571 return elt;
6572 }
6573 return Qnil;
6574 }
6575
6576 DEFUN ("old-delete", Fold_delete, 2, 2, 0, /*
6577 Delete by side effect any occurrences of ELT as a member of LIST.
6578 The modified LIST is returned. Comparison is done with `old-equal'.
6579 If the first member of LIST is ELT, there is no way to remove it by side
6580 effect; therefore, write `(setq foo (old-delete element foo))' to be sure
6581 of changing the value of `foo'.
6582 */
6583 (elt, list))
6584 {
6585 EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
6586 (internal_old_equal (elt, list_elt, 0)));
6587 return list;
6588 }
6589
6590 DEFUN ("old-delq", Fold_delq, 2, 2, 0, /*
6591 Delete by side effect any occurrences of ELT as a member of LIST.
6592 The modified LIST is returned. Comparison is done with `old-eq'.
6593 If the first member of LIST is ELT, there is no way to remove it by side
6594 effect; therefore, write `(setq foo (old-delq element foo))' to be sure of
6595 changing the value of `foo'.
6596 */
6597 (elt, list))
6598 {
6599 EXTERNAL_LIST_LOOP_DELETE_IF (list_elt, list,
6600 (HACKEQ_UNSAFE (elt, list_elt)));
6601 return list;
6601 } 6602 }
6602 6603
6603 DEFUN ("old-equal", Fold_equal, 2, 2, 0, /* 6604 DEFUN ("old-equal", Fold_equal, 2, 2, 0, /*
6604 Return t if two Lisp objects have similar structure and contents. 6605 Return t if two Lisp objects have similar structure and contents.
6605 They must have the same data type. 6606 They must have the same data type.
6611 */ 6612 */
6612 (object1, object2)) 6613 (object1, object2))
6613 { 6614 {
6614 return internal_old_equal (object1, object2, 0) ? Qt : Qnil; 6615 return internal_old_equal (object1, object2, 0) ? Qt : Qnil;
6615 } 6616 }
6617
6618 DEFUN ("old-eq", Fold_eq, 2, 2, 0, /*
6619 Return t if the two args are (in most cases) the same Lisp object.
6620
6621 Special kludge: A character is considered `old-eq' to its equivalent integer
6622 even though they are not the same object and are in fact of different
6623 types. This is ABSOLUTELY AND UTTERLY HORRENDOUS but is necessary to
6624 preserve byte-code compatibility with v19. This kludge is known as the
6625 \"char-int confoundance disease\" and appears in a number of other
6626 functions with `old-foo' equivalents.
6627
6628 Do not use this function!
6629 */
6630 (object1, object2))
6631 {
6632 /* #### blasphemy */
6633 return HACKEQ_UNSAFE (object1, object2) ? Qt : Qnil;
6634 }
6635
6636 #endif
6616 6637
6617 6638
6618 static Lisp_Object replace_string_range_1 (Lisp_Object dest, 6639 static Lisp_Object replace_string_range_1 (Lisp_Object dest,
6619 Lisp_Object start, 6640 Lisp_Object start,
6620 Lisp_Object end, 6641 Lisp_Object end,
11796 DEFSUBR (Felt); 11817 DEFSUBR (Felt);
11797 DEFSUBR (Flast); 11818 DEFSUBR (Flast);
11798 DEFSUBR (Fbutlast); 11819 DEFSUBR (Fbutlast);
11799 DEFSUBR (Fnbutlast); 11820 DEFSUBR (Fnbutlast);
11800 DEFSUBR (Fmember); 11821 DEFSUBR (Fmember);
11801 DEFSUBR (Fold_member);
11802 DEFSUBR (Fmemq); 11822 DEFSUBR (Fmemq);
11803 DEFSUBR (Fold_memq);
11804 DEFSUBR (FmemberX); 11823 DEFSUBR (FmemberX);
11805 DEFSUBR (Fadjoin); 11824 DEFSUBR (Fadjoin);
11806 DEFSUBR (Fassoc); 11825 DEFSUBR (Fassoc);
11807 DEFSUBR (Fold_assoc);
11808 DEFSUBR (Fassq); 11826 DEFSUBR (Fassq);
11809 DEFSUBR (Fold_assq);
11810 DEFSUBR (Frassoc); 11827 DEFSUBR (Frassoc);
11811 DEFSUBR (Fold_rassoc);
11812 DEFSUBR (Frassq); 11828 DEFSUBR (Frassq);
11813 DEFSUBR (Fold_rassq);
11814 11829
11815 DEFSUBR (Fposition); 11830 DEFSUBR (Fposition);
11816 DEFSUBR (Ffind); 11831 DEFSUBR (Ffind);
11817 11832
11818 DEFSUBR (Fold_delete);
11819 DEFSUBR (Fold_delq);
11820 DEFSUBR (FdeleteX); 11833 DEFSUBR (FdeleteX);
11821 DEFSUBR (FremoveX); 11834 DEFSUBR (FremoveX);
11822 DEFSUBR (Fremassoc); 11835 DEFSUBR (Fremassoc);
11823 DEFSUBR (Fremassq); 11836 DEFSUBR (Fremassq);
11824 DEFSUBR (Fremrassoc); 11837 DEFSUBR (Fremrassoc);
11851 DEFSUBR (Fremprop); 11864 DEFSUBR (Fremprop);
11852 DEFSUBR (Fobject_plist); 11865 DEFSUBR (Fobject_plist);
11853 DEFSUBR (Fobject_setplist); 11866 DEFSUBR (Fobject_setplist);
11854 DEFSUBR (Fequal); 11867 DEFSUBR (Fequal);
11855 DEFSUBR (Fequalp); 11868 DEFSUBR (Fequalp);
11869 DEFSUBR (Ffill);
11870
11871 #ifdef SUPPORT_CONFOUNDING_FUNCTIONS
11872 DEFSUBR (Fold_member);
11873 DEFSUBR (Fold_memq);
11874 DEFSUBR (Fold_assoc);
11875 DEFSUBR (Fold_assq);
11876 DEFSUBR (Fold_rassoc);
11877 DEFSUBR (Fold_rassq);
11878 DEFSUBR (Fold_delete);
11879 DEFSUBR (Fold_delq);
11856 DEFSUBR (Fold_equal); 11880 DEFSUBR (Fold_equal);
11857 DEFSUBR (Ffill); 11881 DEFSUBR (Fold_eq);
11882 #endif
11858 11883
11859 DEFSUBR (FassocX); 11884 DEFSUBR (FassocX);
11860 DEFSUBR (FrassocX); 11885 DEFSUBR (FrassocX);
11861 11886
11862 DEFSUBR (Fnconc); 11887 DEFSUBR (Fnconc);