[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
New type specifier?
Unfortunately, even if you had a VOID type specifier, it would not be
reasonable for the compiler to warn about uses of VOID items. It is only
a semantic error if you rely on the particular value that returns, not
if you use a value that happens to come back. For example, consider:
(DEFUN FOO (X)
(IF X (VALUES T 3) (VALUES NIL (THE VOID NIL))))
As I understand it, you're suggesting that this would declare that the
data-flow from the alternative branch of the IF to have a void second value.
The problem is that a program such as:
(DEFUN BAR (X)
(DECLARE (SPECIAL *FOO*))
(MULTIPLE-VALUE-BIND (A B)
(FOO X)
(SETQ *FOO* (CONS A B))
(IF (CAR *FOO*) (CDR *FOO*) NIL)))
is using B legitimately because it is never accessing the second value unless
the first value is true. The problem is that whether a value is "used" is relative,
not absolute. Consider even the program:
(DEFUN BAR (X)
(MULTIPLE-VALUE-BIND (A B)
(FOO X)
(PRINT B)
A))
Surely, you might say, if anything "uses" B, this does. But what if I tell you
now that BAR is not exported and is called internally only from BAZ, which is
defined by:
(DEFUN BAZ (X &AUX BAR-OUTPUT-IS-VALID)
(LET ((BAR-OUTPUT-AS-A-STRING
(WITH-OUTPUT-TO-STRING (*STANDARD-OUTPUT*)
(SETQ BAR-OUTPUT-IS-VALID (BAR X)))))
(IF BAR-OUTPUT-IS-VALID
BAR-OUTPUT-AS-A-STRING
NIL)))
The effect of having used the void value has been contained and is in the global
context cannot be said to have been used. I claim the output of the function BAZ
is meaningful in all situations. In the final analysis, I think the kind of error
you seek to detect is inherently undetectable for fairly deep-seated philosophical
reasons. I would be amazingly irrated if compilers became pretentious enough to
claim that understood my intent in a situation like this, since I think it's
probably possible to construct a proof that they cannot.
Your VOID specifier does have the slight advantage that it provides useful
self-documentation from me to myself about my intent in the program. It might
even prove useful to programs -writing- programs. It's just that in the general
case of reading programs, it's of little or no use in proving that a program
is incorrect because of issues related to this idea of the global vs local
relevance of a computation.