unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* `map-char-table' bug?
@ 2003-05-13 15:41 Ben North
  2003-05-14 21:04 ` Richard Stallman
  0 siblings, 1 reply; 2+ messages in thread
From: Ben North @ 2003-05-13 15:41 UTC (permalink / raw)


According to the Elisp Reference Manual documentation for
`map-char-table':

] This function calls FUNCTION for each element of CHAR-TABLE.
] FUNCTION is called with two arguments, a key and a value. The
] key is a possible RANGE argument for CHAR-TABLE-RANGE---either
] a valid character or a generic character--and the value is
] (char-table-range char-table key).

However, I was trying to scan a syntax table to extract all
parenthesis pairs, and didn't see the documented behaviour.  A
small bit of experimenting produced the following.

The code

(let ((st (syntax-table)))
  (map-char-table (lambda (k v)
                    (if (= k ?\()
                        (progn (print k)
                               (print (char-table-range st k))
                               (print (aref st k))
                               (print v))))
                  st))

produces

40

(4 . 41)

(4 . 41)

nil

whereas that last `nil' should be `(4 . 41)'.  I think the
problem is that Fmap_char_table() calls map_char_table(), which
does

      for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
	{
	  Lisp_Object elt = XCHAR_TABLE (subtable)->contents[i];
	  if (c_function)
	    (*c_function) (arg, make_number (i), elt);
	  else
	    call2 (function, make_number (i), elt);
	}

As far as I can see, this passes, as the VALUE argument to the
FUNCTION argument of `map-char-table', the `i'th entry of the
syntax table, whereas the documentation suggests it will use
default values and parent `char-table's.  This is what
`char-table-range' does, by calling `aref'.

Without having tried it, would it make sense to change
Fmap_char_table() to call Faref() when setting elt?  Something
like

	  Lisp_Object elt = Faref(subtable, i);

maybe?  Lower down in map_char_table(), it does seem that the
default value is used but I'm not familiar enough with the
workings of this code to know what's going on I'm afraid.

Even if my suggestions about the C code are misinformed, I think
this is a real mismatch between documented and actual behaviour.

Thanks,

Ben.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: `map-char-table' bug?
  2003-05-13 15:41 `map-char-table' bug? Ben North
@ 2003-05-14 21:04 ` Richard Stallman
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Stallman @ 2003-05-14 21:04 UTC (permalink / raw)
  Cc: emacs-devel

    (let ((st (syntax-table)))
      (map-char-table (lambda (k v)
			(if (= k ?\()
			    (progn (print k)
				   (print (char-table-range st k))
				   (print (aref st k))
				   (print v))))
		      st))

    produces
    40
    (4 . 41)
    (4 . 41)
    nil

The reason for this is that map-char-table passes the raw contents
of the element, whereas char-table-range and aref handle defaults
and inheritance.

All the other functions that get values from char tables process the
default and inheritance.  The Lisp manual indirectly says that
map-char-table does this too.  I wrote the code--it was not hard.
(It is in many files so I have not included a patch here.)
Does anyone see a reason not to make this change?

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-05-14 21:04 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-05-13 15:41 `map-char-table' bug? Ben North
2003-05-14 21:04 ` Richard Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).