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

LAMBDA expression to the SATISFIES type specifier

    Date: Wed, 11 Sep 85 16:23 EDT
    From: Mike McMahon <MMcM@SCRC-STONY-BROOK.ARPA>

    Page 43 specifies that the predicate name must be a symbol because of
    scoping problems.

    First off, I don't see any reason to disallow lexical closures:

    (deftype foo (x)
      `(satisfies ,#'(lambda (y) (eq x y))))

    As for LAMBDA expressions, I would think that the same scoping rules
    would apply as for DEFMACRO.  That is,

    (deftype foo (x)
      '(satisfies (lambda (y) (eq x y))))

    should not be expected to work any more than

    (defmacro foo (x y)
      `((lambda (z) (eq x z)) ,y))

    In summary, I believe that anything FUNCTIONP is valid as the predicate
    in SATISFIES.  Is there some more subtle scoping problem that I have

The case I was worried about was

(defun foo (x y)
  (declare (type (satisfies (lambda (q) (eq q y))) x))

That's sensible enough, I suppose, but I was leery of the extra
complexity required in a compiler to deal with this (you have to
make closures over type specifiers before handing them off to
SUBTYPEP, etc.).