<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:"times new roman",serif;font-size:large"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 19, 2023 at 6:27 PM Bradley Lucier <<a href="mailto:lucier@math.purdue.edu">lucier@math.purdue.edu</a>> wrote:<br></div><div dir="ltr" class="gmail_attr"><br></div><div dir="ltr" class="gmail_attr"><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><span style="font-family:Arial,Helvetica,sans-serif;font-size:small">Unicode has stretches of code-points that are invalid, doesn't it?  In<br></span>which case complement would always be complement against the full valid<br>Unicode set (which isn't a single contiguous range).</blockquote><div class="gmail_default" style="font-family:"times new roman",serif;font-size:large"></div><div class="gmail_default" style="font-family:"times new roman",serif;font-size:large">The ranges of valid Unicode characters are #x0000 to #xD7FF and #xE000 to #x10FFFF.  As far as char-set-contains? is concerned, it doesn't matter if the non-range #xD7FF to #xDFFF are included or excluded, as there is no way to create a character whose char->int value is in this range.  However, when it comes to enumeration (the cursor functions, -fold, -for-each, -map, ->list, ->string) you do need to special-case this non-range to avoid traversing it.  Alternatively, the special-casing can be done in the set operations, which is probably better because they are less used than the enumerators.</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
It appears to me that it would suffice to use John's representation for <br>
all character sets, but write<br>
<br>
char-set-contains?<br>
<br>
in terms of<br>
<br>
char-alphabetic?<br>
char-lower-case?<br>
char-numeric?<br>
char-upper-case?<br>
char-whitespace?<br>
<br>
for some of the standard character sets.<br></blockquote><div><br></div><div class="gmail_default" style="font-family:"times new roman",serif;font-size:large">The difficulty for a portable implementation of SRFI 14 is that the above functions often cover only ASCII or only Latin-1 in the native implementation, or only cover a subset of the assigned characters corresponding to an older version of Unicode (after the long-obsolete version 1.1, the set of all assigned characters only grows with the version, it never shrinks).  If you know that they are up-to-date, that's a reasonable approach, but if they are incomplete, it's better to do it the other way round: reimplement char-alphabetic? in terms of char-set-contains? and char-set-letter?, etc.</div><div class="gmail_default" style="font-family:"times new roman",serif;font-size:large"><br></div><div class="gmail_default" style="font-family:"times new roman",serif;font-size:large">Note that IMO this statement in the definition of ucs-range->charset</div><div class="gmail_default" style=""><ul style="font-family:Helvetica,sans-serif;color:rgb(0,0,0)"><li style="">If the requested range includes unassigned UCS values, these are silently ignored (the current UCS specification has "holes" in the space of assigned codes).</li></ul><div style=""><font color="#000000" face="times new roman, serif">s<span style="font-size:18px">hould be disregarded, because it makes these functions unnecessarily dependent on a specific version of Unicode.  However, attempts to specify the surrogate codes #\xD800 to #\xDFFF should indeed be excluded, as they cannot ever be assigned.</span></font></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>Maybe a few more codes could be added for P*, S*, M* and N* above 199 in <br>
your encoding in char#.scm to have fast membership testing for all the <br>
"standard" classes.<span class="gmail_default" style="font-family:"times new roman",serif;font-size:large">'</span></blockquote><div><br></div><div class="gmail_default" style="font-family:"times new roman",serif;font-size:large">That makes sense to me.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
</blockquote></div></div>