[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

# Re: Types in CL

```
Date:     Thu, 17 Dec 87 10:48:05 PST
From:     Jeff Barnett <jbarnett@nrtc.northrop.com>

...
PROBLEM I.  Assume that the following have been evaluated
(DEFTYPE T1 '(ARRAY T2 1))
(DEFTYPE T2 '(NOT T1))
Let A be a one-dimensional array of size 1 such that (EQ A (AREF A 0)).
What should the value of (TYPEP A 'T1) be?
...
Yes, a problem. CLtL should specify that the result of a call to TYPEP
that causes an identical subcall (i.e., it loops) is undefined.  Here
is a related (but perhaps better motivated example):

(DEFTYPE TREE (LEAF-TYPE) `(OR ,LEAF-TYPE (VECTOR TREE 2)))
(SETF CIRC-TREE '#(NIL NIL))
(FILL CIRC-TREE CIRC-TREE)
(TYPEP CIRC-TREE '(TREE INTEGER)) => {undefined}

This same problem affects CLtL's definitions of LIST, TRUE-LIST, and
DOTTED-LIST on pg. 28: A circular list is a LIST that is not a TRUE-LIST or
a DOTTED-LIST...

PROBLEM II.  Assume that the following return non-NIL
(SUBTYPEP 'T1 'T2)
(SUBTYPEP 'T2 'T3)
The question is what are the subtypes of the type specifier
(FUNCTION (T2) T2)
I think that the answer is
(FUNCTION (T3) T1)
because the type-specific contract of an F in type (FUNCTION (T2) T2) is
to (1) accept as arguments objects in T2 and (2) return objects in T2.
Therefore, an F that accepts objects in T3 (which includes all of T2)
and returns objects in T1 (all of which are in T2) satisfies that
contract.  An F in (FUNCTION (T1) T3) does not because (1) it does not
promise to handle an object in T2-T1 and (2) may return an object in
T3-T2.  Therefore,
(SUBTYPEP '(FUNCTION (T3) T1) '(FUNCTION (T2) T2))
...
The type specifier (FUNCTION ...) is not acceptable to TYPEP (pg. 47),
therefore it is not acceptable to SUBTYPEP (pg. 72).

-- Nick

```