Duck typing alows true polymorfisim

atbusbook@aol.com wrote:

lets say you want a generic numerical algorithom like sum

Ruby

def sum lst
  lst.inject(0){|total,current| total*current}
end

Java // i dont know if there is a numeric super class for numbers

class Sum{
  public static int sum(int[] lst){
    int total = 0;
    for(int current : lst){
      total+=current;
    }
    return total;
  }
  // repeat for all other number types
}

What's your question? (Or, if no question, point?) :slight_smile:

Totally off topic (and indeed "off-list"..) is that really how ruby
sums a list? How does that work? Doesn't the '*' mean multiply? and
what are the pipe symbols for? (Feel free to ignore these questions. I
should really go look it up myself if I'm so curious..)

Peace,
~Simon

"Simon Forman" <rogue_pedro@yahoo.com> writes:

<Java vs. ruby half-argument>

What's your question? (Or, if no question, point?) :slight_smile:

This is atbusbook. He doesn't *have* a point - he does bizarre stuff
like this. Seriously - google his email address sometime, especially
on google groups.

I'm not going to attempt to understand him, and have concluded after
his "the perens in lisp dilects is there for a reson... macros" post
from August fifth that the best thing to do is ignore him until he
decides to start being coherent.

···

atbusbook@aol.com wrote:

"Simon Forman" <rogue_pedro@yahoo.com> wrote in message
news:1156533807.630662.12330@i42g2000cwa.googlegroups.com...

···

atbusbook@aol.com wrote:

lets say you want a generic numerical algorithom like sum

What's your question? (Or, if no question, point?) :slight_smile:

Reads like the weekly "Ruby is better than Java because XXXXX" post.

The problem is that they don't have to come here to convince
*rubyists* that Ruby is better than language XXX. Perhaps some people
just are to stupid to think.

···

On 8/30/06, athornetdotdemondotnl"@ruby-lang.org Jeroen Wenting <"jwenting> wrote:

"Simon Forman" <rogue_pedro@yahoo.com> wrote in message
news:1156533807.630662.12330@i42g2000cwa.googlegroups.com...
> atbusbook@aol.com wrote:
>> lets say you want a generic numerical algorithom like sum
>>

> What's your question? (Or, if no question, point?) :slight_smile:
>
Reads like the weekly "Ruby is better than Java because XXXXX" post.

--
- Simen

In comp.lang.java.advocacy, Jeroen Wenting
<jwenting>

"Simon Forman" <rogue_pedro@yahoo.com> wrote in message
news:1156533807.630662.12330@i42g2000cwa.googlegroups.com...

lets say you want a generic numerical algorithom like sum

What's your question? (Or, if no question, point?) :slight_smile:

Reads like the weekly "Ruby is better than Java because XXXXX" post.

Well, FWIW one could throw this into the pot and watch it explode:

http://www.approximity.com/ruby/Comparison_rb_st_m_java.html

:slight_smile:

This table needs some work. The leftmost column is
unidentified, for example ("Capability" or "Feature"
suggests itself here) and each of these capabilities or
features should probably have a link to a short description
of the capability or feature, preferably with an example.

Also, one language is very conspicuous by its absence: C#.
One could also add C, Basic, and ISO Pascal; the first is
widely used but lacks polymorphism, inheritance, dynamic
casting, etc., and the last is probably not used anywhere
in its form (though dialects are plenty), since one can't
do anything *with* it, really -- though IIRC someone has
told me it can at least open an arbitrary file now, as
opposed to having the user pass one down in the program
identifier list. :slight_smile:

As for the middle one: which dialect? Was it ever
standardized? Visual Basic is a very object-oriented
language in spots, but it's not the only variant; I
used to use at least 4 other variants off and on:

GWBasic -- old IBM PCs
ABasic -- Amiga variant
AmigaBasic -- Microsoft-sponsored Amiga variant
HP Basic (?) -- load tape into very old HP 21xx-series
computer and one had a multitasking Basic which could
do the simpler stuff, but its error diagnostics were
pure numeric: ERROR 67 IN LINE 20. Fortunately, we
had plenty of pamphlets detailing the errors.

Also, Java now has templates. (The implementation is
pretty gross and has some quirks, IMO, but it's better
than nothing.) C++ has a typing system ("type_of" or
some such; I'd have to look) which yields little
more than the mangled type name and static inheritance
testing capabilities. Of course C++ doesn't have
dynamic inheritance anyway.

One could include additional capabilities:

Dynamic type creation. I don't know if Java has this or not.
One can of course attempt bytecode synthesis -- I think that's
what BCEL uses -- but that's a bit of a hack.

Dynamic method creation. Java does *not* have this. AIUI
Smalltalk-80 does; one can take an existing class and add
methods thereto.

Dynamic method override. This may be an artificial distinction
but in some languages -- Smalltalk-80 again, presumably -- one
can take an existing method implementation and override it in
the same class, but without allowing the creation of new methods.
How this would be enforced without additional keywords and/or
a full-fledged ACL method/metadata system, I for one do not know.

Dynamic method deletion. I for one might only want this in
the context of a "sandbox" but if one can create methods,
one should be able to delete them as well if only because
of undo.

Dynamic method rename. This could lead to much madness
but this might be useful during sandboxing.

Dynamic method signature changing. Eclipse has a
reasonable way of doing it using source but I'll admit to
wondering whether it makes sense given a Method descriptor
whether one should be able to edit (as opposed to viewing
or invoking) that descriptor, and when. One might implement
this as a new method, followed by a delete of the old one.

Dynamic other method deletion. If one can delete one's own
methods in an edit session, should it be possible to delete
others' methods too? An interesting question.

Dynamic inheritance. For those languages that support
inheritance one might liken it to changing what the
language inherits or implements on the fly. I don't
know of any language apart from Smalltalk that can even
think about allowing dynamic inheritance, but it's a thought.

Operator overload (e.g., C++'s operator ==()).

Name overload. C does not have it; C++ and Java do. I suspect
Ruby and Python do as well.

Globals. Java has no globals as such, unless one counts
class names. C is all globals, unless one counts statics.

Unnamed classes. new Runnable() { public void run() {...} }
is Java's contribution. Can be useful.

Nested classes.

Primitive types -- in other words, the int<->Integer
dichotomy we all know and love in Java; such also exists
in C++ and IINM C#. I'm not sure if Smalltalk has such
a concept, or not; Smalltalk allows overrides on numbers.
(In Java one might contemplate 2.toString(), for example!)

Arbitrary integer size. The only language I know having this
is Common LISP.

Explicit module-level identifier scoping. In C++ this
might be implemented during link using the -E flag on ld,
for example (there is the Microsoft concept of exporting
in their DLLs, which is vaguely similar as well).
An identifier could be "global" in the module but
inaccessible to those outside of the module. Modules
can include other modules in C++, which makes life
even more interesting. (This might be more of an
environmental versus a language issue.)

Thread-level variable/value scoping. In Java this is done
using the ThreadLocal class, but is not (AFAICT) supported
by the language proper. This of course differs from
call-level (stack), global-level, and class-level scoping.
One might even contemplate function-level scoping, but
that would only be useful if one can create new functions
on the fly and modify these values; otherwise, they might
as well be static.

Persistability. In Java one can implement Serializable
or Externalizable, and generate output from an object.
I've always considered this a bit of a weird hack but it
can come in handy, and forms one leg of the Java EJB
implementation.

Transient field. In Java a capability exists to mark a
field as transient, which is a hint during serialization
that this field in a class not be persisted. (One can
check for this using the Modifier.TRANSIENT bit.)

Volatile field. In Java there is a volatile keyword. I
don't know its precise semantics but it applies to fields.

Virtuals. In C++ one must explicitly declare a function
virtual; C has none at all, and in Java one must explicitly
declare a function final (disallowing overrides) and cannot
really disable a non-method's "virtuality" at all.

Pure/abstract virtuals. C++ has the "=0" construct; Java
has the abstract keyword.

Static virtuals.

Delegates. This Microsoftish concept is a bit hard for me
to pin down (it feels a lot like a C++ method pointer --
or even a C function pointer) but is occasionally touted
as an advantage for such languages as C++ and the ill-fated
Java++, which had them as part of the language.

First-level object functions. AIUI, this is a high-level
concept which would allow for constructs in a hypothetical
language such as

k = (f @ g)(s1,s2,s3);

if f has arguments (int v) and g has arguments (string s1, string s2,
string s3). It would also allow for constructs such as

h = f @ g;

where h is a "function variable" of some sort -- and it would have
the same signature as g. (The '@' is used in lieu of 'o', although
one might use character U+2218 (ring operator) in a theoretical
language where everyone understands Unicode.)

C#'s event handling emulates this concept to some extent
using the += operator, though I doubt they do it all that
generally -- or all that well.

Function-function operators. Under certain conditions the
construct f + g makes sense, if they have compatible signatures;
one might even write

int (f + g)(int a)
{
    return f(a) + g(a)
}

Ditto for f - g, f * g, and even f += g if f returns a reference.
One can also contemplate unary operators such as '-f' .

Set/collection union/intersection/subtraction/element
of support. This is probably most useful for hard-core
mathematicians and database junkies. :slight_smile: In Java one
might declare a Union class easily enough, which takes
two collections and tries to do something intelligent with
them during a scan with the iterator, and of course
the .contains() method is good enough for now.

Integrated database access (and how tightly). C++ has
none at all, though of one can use various third-party
libraries. Java has some base-level API -- the java.sql.*
and javax.sql* library. I suspect C#'s access is similar;
I don't know regarding Ruby. A variant of COBOL was
able to access the database -- DEC's DBMS product,
which was a CODASIL affair -- by using statements in
the language itself. Nowadays, apparently, such are
considered slightly problematic, mostly because DB defs
change a little too often.

Arbitrary iterator positioning. In C++ some collections
can position an iterator in an arbitrary location within
the collection -- the only obvious one would be arrays.
The closest one might get in current Java is to do a
head(), tail(), or subset() and iterate over that.

GUI support -- this is primarily API/library but might
be put in the language if it makes sense -- perhaps when
combined with collections and sets (e.g., is a point
within a rectangle?), though there are some issues such
as whether one would want to enumerate all the elements
in a collection (points in a rectangle).

There's probably a number I've missed but there are
some interesting and somewhat unexplored directions in Java.
Whether it makes sense to explore them is not clear to me.

···

wrote on Wed, 30 Aug 2006 20:18:52 +0200 <12fblk87ppk7ief@corp.supernews.com>:

atbusbook@aol.com wrote:

--
#191, ewill3@earthlink.net
Windows Vista. Because it's time to refresh your hardware. Trust us.

Daniel Martin wrote:

This is atbusbook. He doesn't *have* a point - he does bizarre stuff
like this. Seriously - google his email address sometime, especially
on google groups.

I'm not going to attempt to understand him, and have concluded after
his "the perens in lisp dilects is there for a reson... macros" post
from August fifth that the best thing to do is ignore him until he
decides to start being coherent.

Wooer. Troll fight over Ruby? (Spot the book reference and win... NOTHING at all!)

David Vallner

The problem is that they don't have to come here to convince
*rubyists* that Ruby is better than language XXX. Perhaps some people
just are to stupid to think.

perhaps it's a bot :slight_smile:

-rr-

···

--

- Simen

[ Al lot of stuff about different languages]

Moi, je prefere le francais, parce que:

  Tous les noms ont gendre, donc le francais est <<sexier>> que
l'anglais. Ooh la la!

  Les plupart des adjectifs ont apres les noms, je ne sais pas quoi,
mais je l'aime bien!

Seriously, as a long time veteran of language wars, I'm tired of the
whole thing.

Perhaps we need some polymorphic bots to fight the never-ending
language war for us!

···

On 8/30/06, The Ghost In The Machine <ewill@sirius.tg00suus7038.net> wrote:

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

The Ghost In The Machine <ewill@sirius.tg00suus7038.net> writes:

Also, one language is very conspicuous by its absence: C#.

He does not date any of the updates, so it's unclear how recently it
has been updated (a lot of the web is stale, like a rotting tree in a
forest.)

AmigaBasic -- Microsoft-sponsored Amiga variant

Well, at the time Microsoft were the makers of the de-facto BASIC
implementations - M-BASIC for CP/M, the various variants in VC-20 and
C-64 and later derivates of those, and many other home computers.
"Sponsored" should probably be "created" instead - I assume they were
paid for the job.

Also, Java now has templates. (The implementation is pretty gross
and has some quirks, IMO, but it's better than nothing.) C++ has a
typing system ("type_of" or some such; I'd have to look) which
yields little more than the mangled type name and static inheritance
testing capabilities. Of course C++ doesn't have dynamic inheritance
anyway.

There's the virtual stuff, and you could conceivably implement dynamic
inheritance via the bare-bones C layer - like function pointers. The
type information in C++ (RTTI) is optional.

Dynamic type creation. I don't know if Java has this or not. One can
of course attempt bytecode synthesis -- I think that's what BCEL
uses -- but that's a bit of a hack.

    Groovy could possibly be used for that; also IIRC Java 6 adds some
features for that. I seem to recall security implications being one
reason this ability wasn't included from the start.

Dynamic method creation. Java does *not* have this. AIUI
Smalltalk-80 does; one can take an existing class and add methods
thereto.

Yes, but that's because a Smalltalk program lives inside a big binary
"image" that is mutable. Woe unto you if that big binary file gets
corrupted.

Dynamic method deletion. I for one might only want this in the
context of a "sandbox" but if one can create methods, one should be
able to delete them as well if only because of undo.

The problem with deleting a method is whether the runtime can handle
it: Smalltalk has doesNotUnderstand:#aMessage, Java has
NoSuchMetohdError - what does C++ do? A zeroed virtual method would
cause a pure virtual method call error, which I guess C++ programmers
are trained to take into account. Also, if class A has a method and
you delet it in subclass B, it breaks the Liskov Substitution
Principle, there B should be able to function where an A is wanted.

Dynamic method rename. This could lead to much madness but this
might be useful during sandboxing.

A method's name and its "address" are distinct, but for dynamic method
dispatch, what about any other code that doesn't know the new name but
assumes the method is called the same?

Dynamic inheritance. For those languages that support inheritance
one might liken it to changing what the language inherits or
implements on the fly. I don't know of any language apart from
Smalltalk that can even think about allowing dynamic inheritance,
but it's a thought.

If you can change a Perl class, er, module's @INC array I think that
would support it.

Operator overload (e.g., C++'s operator ==()).

Or rather "dotless/prefix method invocation with the added baggage of
precedence rules". Smalltalk solves this by 1) not having those
precedence rules, 2) have dotless method invocation and 3)

Name overload. C does not have it; C++ and Java do. I suspect Ruby
and Python do as well.

Are you referring to namespaces, ie. namespace isolation?

Globals. Java has no globals as such, unless one counts class names.
C is all globals, unless one counts statics.

Even the fully qualified classes are only "global" in the context of a
classloader and whatever classloaders it delegates to.

Unnamed classes. new Runnable() { public void run() {...} } is
Java's contribution. Can be useful.

Well, they do end up with a name after compilation. And you do not
want to open that can of worms since then you end up with Ruby and
Smalltalk users dragging out closures and C# and Lisp users dragging
out lambdas... :slight_smile:

Nested classes.

Generally that's just a namespace issue. In Java, a class Fie nested
inside Foo is the top-level class Foo$Fie with some compiler magic to
ensure it's used correctly, which leads to funny stuff like

Foo.Fie object = new Foo().new Fie();

which gets turned into the bytecode equivalent of

Foo$Fie object = new Foo$Fie(new Foo());

Primitive types -- in other words, the int<->Integer dichotomy we
all know and love in Java; such also exists in C++ and IINM C#. I'm
not sure if Smalltalk has such a concept, or not; Smalltalk allows
overrides on numbers. (In Java one might contemplate 2.toString(),
for example!)

In Smalltalk you ask the 1 object to count to 10 for a loop. It makes
sense there, it would not feel "right" in the C family...

Arbitrary integer size. The only language I know having this is
Common LISP.

java.math.BigInteger, but the operations you can perform are limited.

Thread-level variable/value scoping. In Java this is done using the
ThreadLocal class, but is not (AFAICT) supported by the language
proper.

Yes, and that leads to a problem where if you forget to null a
ThreadLocal you can "leak" objects.

One might even contemplate function-level scoping, but that would
only be useful if one can create new functions on the fly and modify
these values; otherwise, they might as well be static.

As long as you make sure you never use a private static member
elsewhere than in that particular method, it can play the role of a
function-level method.

Persistability. In Java one can implement Serializable or
Externalizable, and generate output from an object. I've always
considered this a bit of a weird hack but it can come in handy, and
forms one leg of the Java EJB implementation.

Persistability is left as an excercise to libraries in most languages.

Volatile field. In Java there is a volatile keyword. I don't know
its precise semantics but it applies to fields.

In Java it's generally a hint to the optimizer NOT to optimize away or
make any assumptions about access to a field.

C#'s event handling emulates this concept to some extent using the
+= operator, though I doubt they do it all that generally -- or all
that well.

Well it's closer to a list of function pointers, sorry delegates; not
much more than Java's more explicit (or cumbersome if you like) event
interfaces can do.

Integrated database access (and how tightly). C++ has none at all,
though of one can use various third-party libraries. Java has some
base-level API -- the java.sql.* and javax.sql* library.

Well, those are general library APIs that require native or
socket-based implementation by vendors or third parties.

What you talk about is better represented by "inline" SQL in the form
of SQLJ or Oracle's Pro*C and related products.

It boils down to how much should be in the language (syntax, compiler,
runtime) and how much should be left to libraries. E.g. he has a "no"
for garbage collection in C++, but there are libraries for that sort
of thing (relying mostly on the ability to override the new, delete
and assignment operators. Even in Java you often have a choice of
garbage collector algorithms in a runtime.

Just a quick note in the midst of this:

The Ghost In The Machine wrote:

Dynamic type creation. I don't know if Java has this or not.
One can of course attempt bytecode synthesis -- I think that's
what BCEL uses -- but that's a bit of a hack.

Since no one has pointed this out, I should mention the oft-neglected
class java.lang.reflect.Proxy, which allows you to create at runtime a
class that implements a given set of interfaces and a single instance
of that class. Methods are all handled in a manner similar to ruby's
method_missing - that is, a single method is passed the method (as a
Method object) and arguments (as Object[]).

Beanshell (http://www.beanshell.org/) uses this to allow dynamic,
scripted objects (created at runtime) to implement arbitrary Java
interfaces. Reportedly, this greatly simplifies swing and AWT
programming, since one can ignore methods that are specified as part of
the interface but aren't actually used through the course of the
program.

The Ghost In The Machine wrote:

Delegates. This Microsoftish concept is a bit hard for me
to pin down (it feels a lot like a C++ method pointer --
or even a C function pointer) but is occasionally touted
as an advantage for such languages as C++ and the ill-fated
Java++, which had them as part of the language.

They're basically "method pointers" bound to an instance. With some syntactic sugar and (even in my opinion superfluous) typechecks thrown around. 2.0 also encompasses lambdas / closures under the concept. I'm eyeing Nemerle for functional goodness under .NET - some of the tricks up that language's sleeve look impressive. (Notably native or provided-with-standard-library pattern-matching against XML.)

C#'s event handling emulates this concept to some extent
using the += operator, though I doubt they do it all that
generally -- or all that well.

I have a slight hunch it just compiles to a list of event handler delegates that gets invoked sequentially - not really function combination. I don't even know how the return value of a composite delegate that's not defined to return void is defined.

As to all that well, you don't want to get me started. First-class language support for events should NOT crash and burn in a torrent of tears on a null pointer EVER - an event just not being handled doesn't seem like an edge case worth the error to me.

GUI support -- this is primarily API/library but might
be put in the language if it makes sense

Naw, not really. GUI toolkit holy wars are particularly intricate, and you'd either have to bind to one toolkit on supported platforms, or make an abstract abstract one. I can't decide which is worse. (AWT anyone?)

David Vallner

Hi atbusbook@aol.com! (What's your name?)

Thanks for this interesting email. Unfortunately, I don't see how
exactly it fits into this list. Were you just sharing something cool
you found? We, as a group, are having a hard time figuring out what
you are trying to tell us, though. Is English your native language?
What exactly do you have in mind when you tell us these things?

We'd appreciate a quick response.

Thanks,

Matt

Make it so. =]

···

On 06-08-30, at 19:06, Rick DeNatale wrote:

Perhaps we need some polymorphic bots to fight the never-ending
language war for us!

--
Jeremy Tregunna
jtregunna@blurgle.ca

In comp.lang.java.advocacy, Tor Iver Wilhelmsen
<jadedgamer@hotmail.com>

He does not date any of the updates, so it's unclear how recently it
has been updated (a lot of the web is stale, like a rotting tree in a
forest.)

Aye; my webpage has a similar problem. :slight_smile:

AmigaBasic -- Microsoft-sponsored Amiga variant

Well, at the time Microsoft were the makers of the de-facto BASIC
implementations - M-BASIC for CP/M, the various variants in VC-20 and
C-64 and later derivates of those, and many other home computers.
"Sponsored" should probably be "created" instead - I assume they were
paid for the job.

OK, "created" then. :slight_smile:

Also, Java now has templates. (The implementation is pretty gross
and has some quirks, IMO, but it's better than nothing.) C++ has a
typing system ("type_of" or some such; I'd have to look) which
yields little more than the mangled type name and static inheritance
testing capabilities. Of course C++ doesn't have dynamic inheritance
anyway.

There's the virtual stuff, and you could conceivably implement dynamic
inheritance via the bare-bones C layer - like function pointers. The
type information in C++ (RTTI) is optional.

Oh yeah, that's true. Still not all that dynamic, though, unless
one recompiles.

Dynamic type creation. I don't know if Java has this or not. One can
of course attempt bytecode synthesis -- I think that's what BCEL
uses -- but that's a bit of a hack.

    Groovy could possibly be used for that; also IIRC Java 6 adds some
features for that. I seem to recall security implications being one
reason this ability wasn't included from the start.

Not familiar with Groovy; I'll have to look into that.
It's amazing what's out there; one of the problems with
Free Open Source Software (FOSS) is that there's multiple
choices for the obvious stuff. :slight_smile:

Dynamic method creation. Java does *not* have this. AIUI
Smalltalk-80 does; one can take an existing class and add methods
thereto.

Yes, but that's because a Smalltalk program lives inside a big binary
"image" that is mutable. Woe unto you if that big binary file gets
corrupted.

Indeed.

I for one would want Smalltalk to have the ability to
transcript certain messages but would have to look.
(One might call that an edit audit trail.)

Dynamic method deletion. I for one might only want this in the
context of a "sandbox" but if one can create methods, one should be
able to delete them as well if only because of undo.

The problem with deleting a method is whether the runtime can handle
it: Smalltalk has doesNotUnderstand:#aMessage, Java has
NoSuchMetohdError - what does C++ do? A zeroed virtual method would
cause a pure virtual method call error, which I guess C++ programmers
are trained to take into account.

I'd frankly have to look. My thinking is that it's a message followed
by an exit().

Also, if class A has a method and
you delet it in subclass B, it breaks the Liskov Substitution
Principle, there B should be able to function where an A is wanted.

Heh...an interesting name; I'm not familiar with that
issue. Of course it's important for B to be an A in
many cases, though AFAICT usually what happens is that
A declares a method virtual with an implementation and B
munges it.

Dynamic method rename. This could lead to much madness but this
might be useful during sandboxing.

A method's name and its "address" are distinct, but for dynamic method
dispatch, what about any other code that doesn't know the new name but
assumes the method is called the same?

What indeed? Much madness.

Dynamic inheritance. For those languages that support inheritance
one might liken it to changing what the language inherits or
implements on the fly. I don't know of any language apart from
Smalltalk that can even think about allowing dynamic inheritance,
but it's a thought.

If you can change a Perl class, er, module's @INC array I think that
would support it.

Operator overload (e.g., C++'s operator ==()).

Or rather "dotless/prefix method invocation with the added baggage of
precedence rules". Smalltalk solves this by 1) not having those
precedence rules, 2) have dotless method invocation and 3)

...?

I'll admit Smalltalk has a lot of things, but popularity isn't
unfortunately one of them. :-/

Name overload. C does not have it; C++ and Java do. I suspect Ruby
and Python do as well.

Are you referring to namespaces, ie. namespace isolation?

Hmm...that could use clarification. The general idea is that
Java and C++ allow

void routine1(const char *);
void routine1(int);
void routine1(double);

in the same module or class.

I suppose a slightly better term would be "function overloading", since
that's what it was called some time back.

C does not have this capability, and it occasionally leads to problems
if a program doesn't use proper design methods (such as declaring all
methods in .h files and including them, as opposed to putting local
extern signatures in the .C code -- yes, my prior employer had code
that did exactly that for awhile; hopefully it's cleaned up by now since
it's been almost 6 years :slight_smile: ).

Globals. Java has no globals as such, unless one counts class names.
C is all globals, unless one counts statics.

Even the fully qualified classes are only "global" in the context of a
classloader and whatever classloaders it delegates to.

Good point.

Unnamed classes. new Runnable() { public void run() {...} } is
Java's contribution. Can be useful.

Well, they do end up with a name after compilation.

Picky, picky. :slight_smile: In any event the name is not available
to the program source; one can't expect to do things like

Runnable$1 r = new Runnable() { public void run() {...} }

and hope for it to work. One might be able to do something
slightly silly like

Class c = Class.forName("Runnable$1");

c.newInstance();

but for Java that's slightly problematic, especially if there's
more than one Runnable in that class.

And you do not
want to open that can of worms since then you end up with Ruby and
Smalltalk users dragging out closures and C# and Lisp users dragging
out lambdas... :slight_smile:

Yes, well AFAICT a closure is some code with a little context; in Java
some of the context is required to have final variables, or a method by
which it can pick up its owning class's members or call its routines.

Nested classes.

Generally that's just a namespace issue. In Java, a class Fie nested
inside Foo is the top-level class Foo$Fie with some compiler magic to
ensure it's used correctly, which leads to funny stuff like

Foo.Fie object = new Foo().new Fie();

which gets turned into the bytecode equivalent of

Foo$Fie object = new Foo$Fie(new Foo());

Hm.

Primitive types -- in other words, the int<->Integer dichotomy we
all know and love in Java; such also exists in C++ and IINM C#. I'm
not sure if Smalltalk has such a concept, or not; Smalltalk allows
overrides on numbers. (In Java one might contemplate 2.toString(),
for example!)

In Smalltalk you ask the 1 object to count to 10 for a loop. It makes
sense there, it would not feel "right" in the C family...

Or anywhere else that I know of offhand.

Arbitrary integer size. The only language I know having this is
Common LISP.

java.math.BigInteger, but the operations you can perform are limited.

Hm. OK, "arbitrary number size with transparency".

Thread-level variable/value scoping. In Java this is done using the
ThreadLocal class, but is not (AFAICT) supported by the language
proper.

Yes, and that leads to a problem where if you forget to null a
ThreadLocal you can "leak" objects.

Ugh.

Well, unfortunately for Java it's all too easy to
leak certain objects, though the only one coming to
mind are FileInputStream, FileOutputStream, FileReader,
and FileWriter. Forget to close them before the variable
goes out of scope and they remain open forever, as far as
I can tell.

(Maybe that'll be fixed in a subsequent rev. I don't know.)

One might even contemplate function-level scoping, but that would
only be useful if one can create new functions on the fly and modify
these values; otherwise, they might as well be static.

As long as you make sure you never use a private static member
elsewhere than in that particular method, it can play the role of a
function-level method.

Persistability. In Java one can implement Serializable or
Externalizable, and generate output from an object. I've always
considered this a bit of a weird hack but it can come in handy, and
forms one leg of the Java EJB implementation.

Persistability is left as an excercise to libraries in most languages.

True, and in that library one usually has a base class.

Volatile field. In Java there is a volatile keyword. I don't know
its precise semantics but it applies to fields.

In Java it's generally a hint to the optimizer NOT to optimize away or
make any assumptions about access to a field.

C#'s event handling emulates this concept to some extent using the
+= operator, though I doubt they do it all that generally -- or all
that well.

Well it's closer to a list of function pointers, sorry delegates; not
much more than Java's more explicit (or cumbersome if you like) event
interfaces can do.

Operator overloading has two issues: it's far more convenient to
write something like

Matrix m1, m2;

Matrix m3 = m1 * m2;

instead of

Matrix m3 = m1.multiplyBy(m2);

or

Matrix m3 = Matrix.multiply(m1, m2);

but it's harder for the compiler and the user to parse.
So it's a tradeoff.

The main problem I have with Swing event handling is
that occasionally it's not clear when I have to tell the
listeners that I've done something to a class which manages
a bunch of listeners. Also, ideally, one would not need
to fire off the listeners in sequence -- though without
explicitly spawning subthreads that would be difficult
in Java.

The main problem with C# event handling is that I don't
know its ramifications, but I consider delegates a bit silly,
mostly because of the Java++ fiasco. That was not COOL,
Microsoft. :slight_smile:

Integrated database access (and how tightly). C++ has none at all,
though of one can use various third-party libraries. Java has some
base-level API -- the java.sql.* and javax.sql* library.

Well, those are general library APIs that require native or
socket-based implementation by vendors or third parties.

What you talk about is better represented by "inline" SQL in the form
of SQLJ or Oracle's Pro*C and related products.

There's the issue of how to handle schema changes, as well; that's
probably why nobody wants to tightly integrate anymore. I can't really
blame 'em.

It boils down to how much should be in the language (syntax, compiler,
runtime) and how much should be left to libraries. E.g. he has a "no"
for garbage collection in C++, but there are libraries for that sort
of thing (relying mostly on the ability to override the new, delete
and assignment operators. Even in Java you often have a choice of
garbage collector algorithms in a runtime.

Hm; I'll have to research that. Apart from the aforementioned stream
issues and the occasional "oops I left the thing in the global
Collection" issue, though, I've not had to do much with garbage
collection, though I did write a rather poorly-performing cache.

I will definitely have to fiddle with WeakReference at some point,
though it's probably easier just to punt to a solution like
Hibernate or JBossCache (TreeCache) or even Castor/JDO.

Like I said, FOSS has a lot of stuff out there; the main problem
for me is finding it. :slight_smile:

···

wrote on 31 Aug 2006 18:31:15 +0200 <uzmdklve4.fsf@hotmail.com>: > The Ghost In The Machine <ewill@sirius.tg00suus7038.net> writes: > >> Also, one language is very conspicuous by its absence: C#.

--
#191, ewill3@earthlink.net
Windows Vista. Because it's time to refresh your hardware. Trust us.

The Ghost In The Machine wrote:

In comp.lang.java.advocacy, Tor Iver Wilhelmsen
<jadedgamer@hotmail.com>
wrote
>
>> Also, one language is very conspicuous by its absence: C#.
>
> He does not date any of the updates, so it's unclear how recently it
> has been updated (a lot of the web is stale, like a rotting tree in a
> forest.)

Aye; my webpage has a similar problem. :slight_smile:

>
>> AmigaBasic -- Microsoft-sponsored Amiga variant
>
> Well, at the time Microsoft were the makers of the de-facto BASIC
> implementations - M-BASIC for CP/M, the various variants in VC-20 and
> C-64 and later derivates of those, and many other home computers.
> "Sponsored" should probably be "created" instead - I assume they were
> paid for the job.

OK, "created" then. :slight_smile:

>
>> Also, Java now has templates. (The implementation is pretty gross
>> and has some quirks, IMO, but it's better than nothing.) C++ has a
>> typing system ("type_of" or some such; I'd have to look) which
>> yields little more than the mangled type name and static inheritance
>> testing capabilities. Of course C++ doesn't have dynamic inheritance
>> anyway.
>
> There's the virtual stuff, and you could conceivably implement dynamic
> inheritance via the bare-bones C layer - like function pointers. The
> type information in C++ (RTTI) is optional.

Oh yeah, that's true. Still not all that dynamic, though, unless
one recompiles.

>
>> Dynamic type creation. I don't know if Java has this or not. One can
>> of course attempt bytecode synthesis -- I think that's what BCEL
>> uses -- but that's a bit of a hack.
>
> Groovy could possibly be used for that; also IIRC Java 6 adds some
> features for that. I seem to recall security implications being one
> reason this ability wasn't included from the start.

Not familiar with Groovy; I'll have to look into that.
It's amazing what's out there; one of the problems with
Free Open Source Software (FOSS) is that there's multiple
choices for the obvious stuff. :slight_smile:

>
>> Dynamic method creation. Java does *not* have this. AIUI
>> Smalltalk-80 does; one can take an existing class and add methods
>> thereto.
>
> Yes, but that's because a Smalltalk program lives inside a big binary
> "image" that is mutable. Woe unto you if that big binary file gets
> corrupted.

Indeed.

I for one would want Smalltalk to have the ability to
transcript certain messages but would have to look.
(One might call that an edit audit trail.)

The comments "Woe unto you if that big binary file gets corrupted" are
plain wrong.

For at least 25 years (and perhaps back to Smalltalk-72?) Smalltalk
implementations have comprised an image file, a sources file, and a
change log. The change log records changes to objects, as Smalltalk
statements that can be replayed to reproduce those changes - and as
Smalltalk classes and methods are just objects, that means code changes
are recorded in the change log and can be reproduced even if the image
file is somehow corrupted.

By the late '80s, commercial Smalltalk development had adopted tightly
integrated, fine grained, multi-user version control - everytime a
method was compiled a new edition of the method was recorded in the
version control system, which really helps continuous integration
across the team.

>
>> Dynamic method deletion. I for one might only want this in the
>> context of a "sandbox" but if one can create methods, one should be
>> able to delete them as well if only because of undo.
>
> The problem with deleting a method is whether the runtime can handle
> it: Smalltalk has doesNotUnderstand:#aMessage, Java has
> NoSuchMetohdError - what does C++ do? A zeroed virtual method would
> cause a pure virtual method call error, which I guess C++ programmers
> are trained to take into account.

I'd frankly have to look. My thinking is that it's a message followed
by an exit().

> Also, if class A has a method and
> you delet it in subclass B, it breaks the Liskov Substitution
> Principle, there B should be able to function where an A is wanted.

Heh...an interesting name; I'm not familiar with that
issue. Of course it's important for B to be an A in
many cases, though AFAICT usually what happens is that
A declares a method virtual with an implementation and B
munges it.

>
>> Dynamic method rename. This could lead to much madness but this
>> might be useful during sandboxing.
>
> A method's name and its "address" are distinct, but for dynamic method
> dispatch, what about any other code that doesn't know the new name but
> assumes the method is called the same?

What indeed? Much madness.

>
>> Dynamic inheritance. For those languages that support inheritance
>> one might liken it to changing what the language inherits or
>> implements on the fly. I don't know of any language apart from
>> Smalltalk that can even think about allowing dynamic inheritance,
>> but it's a thought.
>
> If you can change a Perl class, er, module's @INC array I think that
> would support it.
>
>> Operator overload (e.g., C++'s operator ==()).
>
> Or rather "dotless/prefix method invocation with the added baggage of
> precedence rules". Smalltalk solves this by 1) not having those
> precedence rules, 2) have dotless method invocation and 3)

...?

I'll admit Smalltalk has a lot of things, but popularity isn't
unfortunately one of them. :-/

>
>>
>> Name overload. C does not have it; C++ and Java do. I suspect Ruby
>> and Python do as well.
>
> Are you referring to namespaces, ie. namespace isolation?

Hmm...that could use clarification. The general idea is that
Java and C++ allow

void routine1(const char *);
void routine1(int);
void routine1(double);

in the same module or class.

I suppose a slightly better term would be "function overloading", since
that's what it was called some time back.

C does not have this capability, and it occasionally leads to problems
if a program doesn't use proper design methods (such as declaring all
methods in .h files and including them, as opposed to putting local
extern signatures in the .C code -- yes, my prior employer had code
that did exactly that for awhile; hopefully it's cleaned up by now since
it's been almost 6 years :slight_smile: ).

>
>> Globals. Java has no globals as such, unless one counts class names.
>> C is all globals, unless one counts statics.
>
> Even the fully qualified classes are only "global" in the context of a
> classloader and whatever classloaders it delegates to.

Good point.

>
>> Unnamed classes. new Runnable() { public void run() {...} } is
>> Java's contribution. Can be useful.
>
> Well, they do end up with a name after compilation.

Picky, picky. :slight_smile: In any event the name is not available
to the program source; one can't expect to do things like

Runnable$1 r = new Runnable() { public void run() {...} }

and hope for it to work. One might be able to do something
slightly silly like

Class c = Class.forName("Runnable$1");

c.newInstance();

but for Java that's slightly problematic, especially if there's
more than one Runnable in that class.

> And you do not
> want to open that can of worms since then you end up with Ruby and
> Smalltalk users dragging out closures and C# and Lisp users dragging
> out lambdas... :slight_smile:

Yes, well AFAICT a closure is some code with a little context; in Java
some of the context is required to have final variables, or a method by
which it can pick up its owning class's members or call its routines.

>
>> Nested classes.
>
> Generally that's just a namespace issue. In Java, a class Fie nested
> inside Foo is the top-level class Foo$Fie with some compiler magic to
> ensure it's used correctly, which leads to funny stuff like
>
> Foo.Fie object = new Foo().new Fie();
>
> which gets turned into the bytecode equivalent of
>
> Foo$Fie object = new Foo$Fie(new Foo());

Hm.

>
>> Primitive types -- in other words, the int<->Integer dichotomy we
>> all know and love in Java; such also exists in C++ and IINM C#. I'm
>> not sure if Smalltalk has such a concept, or not; Smalltalk allows
>> overrides on numbers. (In Java one might contemplate 2.toString(),
>> for example!)
>
> In Smalltalk you ask the 1 object to count to 10 for a loop. It makes
> sense there, it would not feel "right" in the C family...

Or anywhere else that I know of offhand.

>
>> Arbitrary integer size. The only language I know having this is
>> Common LISP.
>
> java.math.BigInteger, but the operations you can perform are limited.

Hm. OK, "arbitrary number size with transparency".

Quite a few language implementations provide arbitrary precision
integers, I'll just mention Smalltalk again.

···

on 31 Aug 2006 18:31:15 +0200 > <uzmdklve4.fsf@hotmail.com>: > > The Ghost In The Machine <ewill@sirius.tg00suus7038.net> writes:

>
>> Thread-level variable/value scoping. In Java this is done using the
>> ThreadLocal class, but is not (AFAICT) supported by the language
>> proper.
>
> Yes, and that leads to a problem where if you forget to null a
> ThreadLocal you can "leak" objects.

Ugh.

Well, unfortunately for Java it's all too easy to
leak certain objects, though the only one coming to
mind are FileInputStream, FileOutputStream, FileReader,
and FileWriter. Forget to close them before the variable
goes out of scope and they remain open forever, as far as
I can tell.

(Maybe that'll be fixed in a subsequent rev. I don't know.)

>
>> One might even contemplate function-level scoping, but that would
>> only be useful if one can create new functions on the fly and modify
>> these values; otherwise, they might as well be static.
>
> As long as you make sure you never use a private static member
> elsewhere than in that particular method, it can play the role of a
> function-level method.
>
>> Persistability. In Java one can implement Serializable or
>> Externalizable, and generate output from an object. I've always
>> considered this a bit of a weird hack but it can come in handy, and
>> forms one leg of the Java EJB implementation.
>
> Persistability is left as an excercise to libraries in most languages.

True, and in that library one usually has a base class.

>
>> Volatile field. In Java there is a volatile keyword. I don't know
>> its precise semantics but it applies to fields.
>
> In Java it's generally a hint to the optimizer NOT to optimize away or
> make any assumptions about access to a field.
>
>> C#'s event handling emulates this concept to some extent using the
>> += operator, though I doubt they do it all that generally -- or all
>> that well.
>
> Well it's closer to a list of function pointers, sorry delegates; not
> much more than Java's more explicit (or cumbersome if you like) event
> interfaces can do.

Operator overloading has two issues: it's far more convenient to
write something like

Matrix m1, m2;

Matrix m3 = m1 * m2;

instead of

Matrix m3 = m1.multiplyBy(m2);

or

Matrix m3 = Matrix.multiply(m1, m2);

but it's harder for the compiler and the user to parse.
So it's a tradeoff.

The main problem I have with Swing event handling is
that occasionally it's not clear when I have to tell the
listeners that I've done something to a class which manages
a bunch of listeners. Also, ideally, one would not need
to fire off the listeners in sequence -- though without
explicitly spawning subthreads that would be difficult
in Java.

The main problem with C# event handling is that I don't
know its ramifications, but I consider delegates a bit silly,
mostly because of the Java++ fiasco. That was not COOL,
Microsoft. :slight_smile:

>
>> Integrated database access (and how tightly). C++ has none at all,
>> though of one can use various third-party libraries. Java has some
>> base-level API -- the java.sql.* and javax.sql* library.
>
> Well, those are general library APIs that require native or
> socket-based implementation by vendors or third parties.
>
> What you talk about is better represented by "inline" SQL in the form
> of SQLJ or Oracle's Pro*C and related products.

There's the issue of how to handle schema changes, as well; that's
probably why nobody wants to tightly integrate anymore. I can't really
blame 'em.

>
> It boils down to how much should be in the language (syntax, compiler,
> runtime) and how much should be left to libraries. E.g. he has a "no"
> for garbage collection in C++, but there are libraries for that sort
> of thing (relying mostly on the ability to override the new, delete
> and assignment operators. Even in Java you often have a choice of
> garbage collector algorithms in a runtime.

Hm; I'll have to research that. Apart from the aforementioned stream
issues and the occasional "oops I left the thing in the global
Collection" issue, though, I've not had to do much with garbage
collection, though I did write a rather poorly-performing cache.

I will definitely have to fiddle with WeakReference at some point,
though it's probably easier just to punt to a solution like
Hibernate or JBossCache (TreeCache) or even Castor/JDO.

Like I said, FOSS has a lot of stuff out there; the main problem
for me is finding it. :slight_smile:

--
#191, ewill3@earthlink.net
Windows Vista. Because it's time to refresh your hardware. Trust us.