Considering his opinions on Jews
By some standards, the pro-Java side just won the debate right there.
Series Expansion <
[email protected]> writes:
[an attribution is missing here, but it was obviously a Lisp partisan]
Then it's a good thing it's not necessary to edit any generic functions
to add methods, isn't it?
This statement contradicts an earlier statement that the means by
which methods are dispatched is through generic functions, which
contain dispatch tables that reference all of the methods that they
can dispatch.
In <
[email protected]>
anonymous_c_lisper posted an example of a generic function:
(defgeneric frobnobdicate (a b)

method ((foo foo) (bar bar)) ;;arguments
.. body)

method ((foo foo) (baz baz))
..body))
It seems quite obvious that adding another method, this one with a new
class quux as a second argument type, would require editing that code
to:
(defgeneric frobnobdicate (a b)

method ((foo foo) (bar bar)) ;;arguments
.. body)

method ((foo foo) (baz baz))
.. body)

method ((foo foo) (quux quux))
..body))
The problem arises if it is not your code to edit. Then you cannot add
a frobnobdicate method to your quux class.
There appear to be only three alternatives here:
1. The problem arises;
2. anonymous_c_lisper was wrong about something; or
3. You are wrong about something.
The suggestion floated recently that code like the above be generated
by automation does not materially alter the parameters of this debate.
The above alteration, whether automated or not, poses a problem if the
code is not yours to modify, and an even larger problem if conflicting
modifications are made by different developers whose code will
eventually be combined, granting the assumption that
(defgeneric frobnobdicate (a b)

method ((foo foo) (bar bar)) ;;arguments
.. body)

method ((foo foo) (baz baz))
.. body)

method ((foo foo) (quux quux))
.. body)

method ((foo foo) (quux quux))
..different body))
will fail in some manner or another.
This particular corner of the debate is but one of many where evidence
has surfaced that strongly suggests that Lisp is centered around a
lone-wolf development model and, in particular, that in its present
form as described by you it is unsuited to use by a large team. Pair
programming may well be the largest team size up to which it will
scale given the numerous issues that have come to light.
Even supposing that one were to have dispatch tables like the above,
widely-used macros, and similar constructs gate-kept by "owners"
within a larger development team, all requests to for instance add a
new dispatch to a generic function would have to go through the
appropriate gatekeepers. Whereupon the scaling problems described in
__The_Mythical_Man_Month__ come into play full-force; the volume of
such requests will tend to grow as the square of the number of
developers, and the number received by the owner of a particular piece
of such code will tend to grow linearly, soon overwhelming them. The
encapsulation and modularity of code offered by OO languages like Java
reduces this problem enormously, as only defining and changing widely-
used interfaces requires that level of coordination, and everyone can
work within the encapsulation walls of their classes as if alone
without fear that they will tread upon any toes. Even if they wish to
put a frobnobdicate method into a class named quux that they use to
implement their piece of the program, and other frobnobdicate methods
already exist.
Imagine the chaos if there was a master list of all classes that
implemented "Comparable" for example and for anyone to add
comparability to a class in their corner of the codebase had to get it
approved so the owner of the comparable-classes list could add it to
the list, this list being needed by the JVM to dispatch compare()
method invocations. Fortunately Java was not designed this way, but if
we replace compare() with frobnobdicate, we see that we have precisely
the described situation in Lisp, at least according to what
anonymous_c_lisper wrote and making some obvious inferences therefrom.
Probably this is why multiple dispatch is generally not found in
languages that are used to develop large, professional software
projects. It seems that multiple dispatch in general cannot be
implemented without requiring more explicit management of dispatch
tables than occurs typically in single dispatch languages, and then
those dispatch tables become bottlenecks in the development process,
in turn placing an upper bound on effective team size and thus on
effective project size.
But that would be terrible!
That, however, is precisely what happens in dynamically-typed object-
oriented systems, since without static types the compiler cannot know
the types of the objects receiving particular messages.
It follows from your emotional outburst above that dynamically-typed
object-oriented systems are terrible. Interestingly, that category
appears to include CLOS.
Your outburst is rather puzzling given that you were formerly arguing
the other side.
Be concerned no longer. What would stop you from doing that?
I believe the concerns I have were adequately outlined above, with
code examples and a detailed explanation of the scaling problems,
supported by mathematical calculations and a reference. If you find
that insufficient, I am not sure that I can be of further assistance
to you in understanding the matter.
Oh, will you come off it? Do you intentionally adopt the most patently
absurd interpretation of every statement?
No, I merely take them at face value and derive what logical
conclusions I can. Note also that I did not specifically accuse you,
personally, of making the particular absurd insinuation referenced
above.
I'm sure that person (Kenny?) never believed such a thing, and I have no
idea why you think they did.
Because they expressed such a belief in their writing.
One could deny that 50% of all bugs are stealthy type errors, but since
we already did static typing these last few weeks, I won't get involved.
Type errors are only stealthy if one eschews the use of a language
with static type checking, of course.
For now, I leave you with another reference, an academic paper whose
conclusion, to my mind, indicates that implicitly-typed languages,
even statically-typed ones like OCaml, exhibit scaling problems caused
by supralinear growth with project size of type-error debugging
effort:
http://portal.acm.org/citation.cfm?id=176454.176460