# Re: bounded, infinite ranges?

• To: dyer@eagle.sharebase.com, macrakis@osf.org
• Subject: Re: bounded, infinite ranges?
• From: dyer@eagle.sharebase.com (Scot Dyer)
• Date: Tue, 20 Oct 92 14:17:02 PDT
• Cc: info-dylan@cambridge.apple.com

///    ...My reason: a range is over floats, yes?  Therefore no
///    enumerative approach would terminate (any range has an infinite
///    number of elements), even if one was provided.
///
/// Huh?  Floats are not reals -- after all, they're represented finitely.
///
/// As for the meaning of IEEE infinity, it is not really infinity either:
/// it stands for all numbers too large to represent in a given floating
/// type.

Programs I have written using this kind of knowledge are usually cryptic at
best.  Also, generating the elements of the range sequentially may be
non-trivial, and there are usually way too many to be useful.

///    These values that sit outside the system, "top" and "bottom" values
///    are usually very important to a program.  IMHO, it was unfortunate
///    that they were left out of the Dylan language spec.
///
/// I agree.  Dylan appears to use #f as a substitute for a void value in
/// some cases, e.g. while, until, bind with no forms.  This, and the fact
/// that ANY non-#f value is true, seem to be residual Lispisms.

Providing a structured "bottom" would present one aesthetically pleasing
solution to this.  Ergo (and 1 #f) --> {bottom: and of non-boolean: 1}.  This
also preserves the focus on values, rather than control mechanisms.

Treating bottom values as not inheritting <object> (since they aren't valid
objects, but rather 'outside the normal system') would make integration of
such values into an exception system a bit easier.  When no method can be
found to apply (no error correcting method), program execution could halt with
a back-trace (the bottom value having accumulated this on the way out...)
Either that or create {bottom: no applicable method}

Something like: {bottom: car {bottom: car ()}} would be the error from
(car (car '())).  Of course, pretty-printing such values would be important.

Arranging these bottom values into a class heterarchy (as Dylan already so
wisely does with exceptions, IMHO) gives programmers good flexibility insofar
as where to catch the error/exception.  Given that exceptions are exceptional,
too, the cost of backing out and collecting the trace seems minimal, especially
since that information should be accessible to the program...

/// Note that adding void to the possible returns of a function increases
/// function-return overhead, since of course you have to find some place
/// for the necessary bits....  (If you do it by some control convention,
/// there is still some overhead somewhere.)

Dylan already pays the full price of type tags.  I say take advantage of them.

///         -s

-- Scot

P.S.  Perhaps we should be creating a new mailing-list, for Dylan specification
requests and/or conversations.  I don't want to waste the signal-to-noise
ratio in this group, but this stuff seems like an important consideration.
Even though (unless we're all going to implement Dylan supersets -- another
PL/I disaster! :-) they could be construed as pertaining to implementation.

I hope someone at Apple hears this.  I should suspect that someone there