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

Re: Lightness vs. Largeness



At 01:42 AM 12/6/01, Dan Weinreb wrote:
>    Date: Wed, 05 Dec 2001 13:08:12 -0500
>    From: Scott McKay <swm@hotdispatch.com>
>
>(Not to dispute the greater point from which I wrested the following
>excerpt:)
>
>    I've written 100,0000-line Lisp applications that don't have any
>    type declarations.
>
>Me too, but my current opinion is that the next time I write a
>100,000-line application, I'm going to use type declarations
>everywhere I can, if the langauge makes them available (whether
>mandatory or optional).  I've really changed my mind on this over the
>years.  Partly it's because type declarations sometimes catch
>programming mistakes statically, and partly it's because they make
>programs easier to read.
>
>How's that for a provocative statement?  :-) Yes, easier to read.
>It's easier to understand a program if you can see, right on its face,
>important invariants.  Assertions are helpful, and type declarations
>are an important special case of assertions.

It's not provocative to me at all, since I had the same change of mind
as you.  My Dylan and more modern Lisp code all use type declarations,
at least for all the "contracts".

I still think that's it's important for type declarations not to be mandatory,
and for type information to be carried by objects, not by variables.  I
haven't change my mind on that.  (So there :-)

>In the code I work on, another useful assertion at a many points is
>"There must (or must not) be a transaction in progress for the current
>thread at this point"; this doesn't provide static checking, only
>dynamic checking, but it makes the program easier to read in a similar
>way.
>
>Right now, when I am reading through a large Java program that I have
>never read before, one of the first things I do is scan through the
>code in order to figure out, for each "Map" and "List" and "Set" field
>( instance variable), what the actual types are (the types of the
>elements of the sets, or the keys and values of the map, etc), so that
>I can draw a UML-like picture of the data structures.  I'm looking
>forward to the new Java in which these classes will be parameterized
>so that I won't have to go through this step.  (Maybe someday I'll get
>for Xmas a tool that creates the UML diagrams...)
>
>Sure, it's good for the type declarations to be optional, particularly
>when you're writing a very small program.  If I were in a team writing
>a large program in a declarations-optional language, though, I'd think
>carefully about team coding standards regarding where it's OK to omit
>type declarations.

I'm pretty insistent that type declarations be included in input and outputs,
since they do render the code much easier to read.

>(In another discussion, I learned an interesting thing about the Curl
>language.  In Java, there is one type for every class, but in Curl
>there are two: a type that allows any object of that class or null,
>and a type that allows any object of that class but not null.  That
>sounds useful.  Of course there are important tradeoffs about how
>expressive you make your type system.)
>
>Do you think it's true that, for any language, if you want type
>declarations to be optional, there must be some type that is the union
>of all types?  (There is no such type in Java because of the
>"primitive" types; otherwise you could imagine omitted type
>declarations "defaulting" to "Object", although perhaps the grammar
>would need some adjusting...)

Yeah, you need a type "Object".

I think that Java does not have both "type" and "null-or-type" is a
real omission.  Being able to assert that this Set *really is* a Set
(and not a null) is quite important.  It's a royal pain to look at Java
code littered with 'if (x != null) ...'