[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