all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Federico Tedin <federicotedin@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: Questions regarding char-table-range RANGE arg
Date: Fri, 01 Sep 2023 10:34:12 +0300	[thread overview]
Message-ID: <8334zycpor.fsf@gnu.org> (raw)
In-Reply-To: <182a9111-f3e1-e098-97ec-1f5a5269362d@gmail.com> (message from Federico Tedin on Thu, 31 Aug 2023 23:54:01 +0200)

> Date: Thu, 31 Aug 2023 23:54:01 +0200
> From: Federico Tedin <federicotedin@gmail.com>
> 
> Hi everyone,
> 
> I was trying to understand better how char tables work but I got stuck 
> at the following:
> 
> In the docs for `char-table-range' 
> (https://www.gnu.org/software/emacs/manual/html_node/elisp/Char_002dTables.html), 
> it is mentioned
> that it is possible to specify (from . to) as the value for RANGE. This 
> already seemed a bit unexpected for me, as the function
> is supposed to retrieve a single value from the char table - how could 
> it do it for a range, where potentially many different values
> could be defined?

Char-tables usually include whole ranges of characters with the same
value.  The implementation of char-tables stores such ranges
efficiently, using just one slot instead of a separate slot for every
character.  This is actually the main reason for having char-tables in
Emacs, and the main design goal for their implementation: to allow
efficient storage of character properties and quick access to those
properties by character code.

Thus, querying the value that is in effect for a range of characters
makes a lot of sense.

> I did some tests:
> 
> (setq tt (make-char-table nil))
> 
> (set-char-table-range tt (cons 10 20) "foo")
> (set-char-table-range tt (cons 21 25) "bar")
> [...]
> So from my tests it seems like only `from' is considered? Similar to the 
> case where RANGE is just a character.

Basically yes (but see below).

> I was hoping someone
> with a better understanding of character tables could maybe explain the 
> behaviour observed above. It is possible it could me just
> missinterpreting the documentation (I am trying to keep a more end-user 
> perspective for this, i.e. not look at the Emacs source code
> and only use documentation). I did try looking also into 
> chartab-tests.el though but could not find more information there.

The implementation is in chartab.c, you should look there for the
details.

What the implementation does is access the value at FROM, and then, if
TO is greater than FROM, shrink the range FROM..TO to the largest
range of character codes that have the same value as FROM.  However,
the information about the shrunk range is not returned to the caller
of char-table-range.  (If this is deemed important, we could add an
optional argument to char-table-range which, if non-nil, would cause
the function to return a list of, say, (FROM TO VALUE), where TO is
the actual value of the shrunk range.)

So in the examples you tried:

> (char-table-range tt (cons 5 15)) ; includes some "foo" values?
>    -> nil ; no

Here TO was internally set to 9.

> (char-table-range tt (cons 15 22)) ; includes some "foo" and "bar" values?
>    -> "foo" ; ok, only the first range was considered

Here, TO was internally set to 20.

> (char-table-range tt (cons 15 0)) ; what if I set `to' to a nonsensical 
> value?
>    -> "foo"

Here TO was ignored, because it is smaller than FROM.

> (char-table-range tt (cons 15 99999)) ; or this one
>    -> "foo"

Here TO was internally set to 20.

I hope this answers your questions.



  reply	other threads:[~2023-09-01  7:34 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-31 21:54 Questions regarding char-table-range RANGE arg Federico Tedin
2023-09-01  7:34 ` Eli Zaretskii [this message]
2023-09-02  8:36   ` Federico Tedin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8334zycpor.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=federicotedin@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.