Mercurial > hg > xemacs-beta
diff src/chartab.c @ 5222:18c0b5909d16
Use keywords in structure syntax; new #define, NEED_TO_HANDLE_21_4_CODE 1
src/ChangeLog addition:
2010-05-31 Aidan Kehoe <kehoea@parhasard.net>
* rangetab.c (print_range_table, rangetab_instantiate)
(structure_type_create_rangetab):
* chartab.c (print_char_table, chartab_instantiate)
(structure_type_create_chartab):
* faces.c (syms_of_faces, print_face, face_validate):
Move structure syntax in these files to using keywords by default,
as is done in Common Lisp and GNU Emacs, accepting for the moment
the older non-keywords syntax too.
* glyphs.h: No need to have Q_data here.
* general-slots.h: Add Q_data, Q_type here.
* config.h.in (NEED_TO_HANDLE_21_4_CODE):
New #define, always 1 for the moment, replacing the previous
never-really-used NO_NEED_TO_HANDLE_21_4_CODE, and avoiding
confusing syntax.
* eval.c (Ffuncall): Wrap the hack that allows #'throw to be
funcalled in #ifdef NEED_TO_HANDLE_21_4_CODE.
* elhash.c (syms_of_elhash): Move Q_type, Q_data to
general-slots.h. Change to NEED_TO_HANDLE_21_4_CODE throughout
this file.
lisp/ChangeLog addition:
2010-05-31 Aidan Kehoe <kehoea@parhasard.net>
* specifier.el (current-display-table):
Use keywords in the structure syntax here, now we've moved to that
by default in C.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Mon, 31 May 2010 16:47:44 +0100 |
parents | 71ee43b8a74d |
children | 02c282ae97cb |
line wrap: on
line diff
--- a/src/chartab.c Sun May 30 15:16:07 2010 +0100 +++ b/src/chartab.c Mon May 31 16:47:44 2010 +0100 @@ -336,7 +336,7 @@ arg.printcharfun = printcharfun; arg.first = 1; - write_fmt_string_lisp (printcharfun, "#s(char-table type %s data (", + write_fmt_string_lisp (printcharfun, "#s(char-table :type %s :data (", 1, char_table_type_to_symbol (ct->type)); map_char_table (obj, &range, print_table_entry, &arg); write_ascstring (printcharfun, "))"); @@ -1544,35 +1544,67 @@ } static Lisp_Object -chartab_instantiate (Lisp_Object data) +chartab_instantiate (Lisp_Object plist) { Lisp_Object chartab; Lisp_Object type = Qgeneric; Lisp_Object dataval = Qnil; - while (!NILP (data)) + if (KEYWORDP (Fcar (plist))) { - Lisp_Object keyw = Fcar (data); - Lisp_Object valw; - - data = Fcdr (data); - valw = Fcar (data); - data = Fcdr (data); - if (EQ (keyw, Qtype)) - type = valw; - else if (EQ (keyw, Qdata)) - dataval = valw; + PROPERTY_LIST_LOOP_3 (key, value, plist) + { + if (EQ (key, Q_data)) + { + dataval = value; + } + else if (EQ (key, Q_type)) + { + type = value; + } + else if (!KEYWORDP (key)) + { + signal_error + (Qinvalid_read_syntax, + "can't mix keyword and non-keyword structure syntax", + key); + } + else + ABORT (); + } } +#ifdef NEED_TO_HANDLE_21_4_CODE + else + { + PROPERTY_LIST_LOOP_3 (key, value, plist) + { + if (EQ (key, Qdata)) + { + dataval = value; + } + else if (EQ (key, Qtype)) + { + type = value; + } + else if (KEYWORDP (key)) + signal_error + (Qinvalid_read_syntax, + "can't mix keyword and non-keyword structure syntax", + key); + else + ABORT (); + } + } +#endif /* NEED_TO_HANDLE_21_4_CODE */ chartab = Fmake_char_table (type); - data = dataval; - while (!NILP (data)) + while (!NILP (dataval)) { - Lisp_Object range = Fcar (data); - Lisp_Object val = Fcar (Fcdr (data)); + Lisp_Object range = Fcar (dataval); + Lisp_Object val = Fcar (Fcdr (dataval)); - data = Fcdr (Fcdr (data)); + dataval = Fcdr (Fcdr (dataval)); if (CONSP (range)) { if (CHAR_OR_CHAR_INTP (XCAR (range))) @@ -1887,8 +1919,13 @@ st = define_structure_type (Qchar_table, 0, chartab_instantiate); +#ifdef NEED_TO_HANDLE_21_4_CODE define_structure_type_keyword (st, Qtype, chartab_type_validate); define_structure_type_keyword (st, Qdata, chartab_data_validate); +#endif /* NEED_TO_HANDLE_21_4_CODE */ + + define_structure_type_keyword (st, Q_type, chartab_type_validate); + define_structure_type_keyword (st, Q_data, chartab_data_validate); } void