[Openmcl-devel] Extended-char is subtype of any other type
R. Matthew Emerson
rme at acm.org
Thu Mar 2 09:03:19 PST 2017
> On Mar 2, 2017, at 2:58 AM, Renzo Orsini <renzo.orsini at gmail.com> wrote:
> I found this strange behaviour when applying subtypep to extended-char:
> $ ccl
> Welcome to Clozure Common Lisp Version 1.11-r16635 (DarwinX8664)!
> CCL is developed and maintained by Clozure Associates. For more information
> about CCL visit http://ccl.clozure.com. To enquire about Clozure's Common Lisp
> consulting services e-mail info at clozure.com or visit http://www.clozure.com.
> ? (subtypep 'extended-char 'bit)
> ? (subtypep 'extended-char 'function)
> … and similarly for many other types.
I'm not much of a language lawyer, but I think I can explain this.
Recall that a CL type is a set of objects.
In CCL, there is only one character type. Thus, the set of objects denoted by the type (and character (not base-char)) contains no members.
The type that contains no objects is named nil.
(subtypep 'extended-char nil) => t, t
(subtypep nil 'extended-char) => t, t
This shows that, on CCL, extended-char and nil are two names for the same thing (the empty set in this case).
The type nil is a subtype of every type. See http://www.lispworks.com/documentation/HyperSpec/Body/t_nil.htm
Thus, when you write (subtypep 'extended-char 'bit), it is as if you are writing (subtypep nil 'bit). And (subtypep nil x) is t, t for any type x.
> while the HyperSpec says (http://www.lispworks.com/documentation/HyperSpec/Body/t_extend.htm#extended-char):
> The type extended-char is equivalent to the type (and character (not base-char)).
That entry also says: The type extended-char might have no elements in implementations in which all characters are of type base-char.
I hope this explanation is correct and helpful.
More information about the Openmcl-devel