Duck typing alows true polymorfisim

Discussion in 'Ruby' started by atbusbook@aol.com, Aug 25, 2006.

  1. Guest

    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
    }
     
    , Aug 25, 2006
    #1
    1. Advertising

  2. Simon Forman Guest

    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?) :)

    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, Aug 25, 2006
    #2
    1. Advertising

  3. John Bokma Guest

    John Bokma, Aug 25, 2006
    #3
  4. David Ells Guest

    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
    > }



    Any more to add? Your question is not exactly clear. Are you asking how
    to do higher order procedures in Python? Here's sum as a higher-order
    procedure... It sums the numbers from a to b (or any thing that can be
    compared and added with "<" and "+").

    def Sum(term, next, a, b):
    if(a > b):
    return 0
    else:
    return (term(a) + (Sum(term, next, next(a), b)

    This function takes two functions (term and next) and two objects (in
    our case numbers) representing the range to sum across. Now let's say
    you want to add the numbers 1 through 10. The term for the summation
    would just be the number, so the term function would simply be a
    function called identity, and could be defined as

    def identity(x):
    return x

    To get the next term, we are just adding one each time (i.e. 1, 2, 3,
    4, ...). So our next function is

    def increment(x):
    return x += 1

    Then we call Sum(identity, increment, 1, 10), and we get 1 + 2 + 3 + 4
    + and so on.

    Now what if you wanted the sum of the CUBES of 1 through 10? Easy, we
    replace the term function with a function cube(x) that returns x*x*x.

    Sum(cube,increment,1,10)

    Hence each term in our summation is the cube, but we are still
    incrementing by one each time, so we get (1^3 + 2^3 + 3^3 + 4^3 + ...)

    Similarly we can change the next function to skip certain number, meet
    certain requirement, do some tranformation, whatever. The fact that
    python accept and uses functions as parameters to other functions is
    awesome in terms of power, but it can get a little mind boggling
    sometimes.
     
    David Ells, Aug 25, 2006
    #4
  5. Guest

    What was i thinkinng repace * with + i was'nt thinking i origanaly
    thaught of sum of squares so i put a * insted of a +
     
    , Aug 25, 2006
    #5
  6. Simon Forman Guest

    wrote:
    > What was i thinkinng repace * with + i was'nt thinking i origanaly
    > thaught of sum of squares so i put a * insted of a +


    But again, what's your question?
     
    Simon Forman, Aug 25, 2006
    #6
  7. wrote:
    > Java // i dont know if there is a numeric super class for numbers


    It is, confusingly enough, Number. And this is a silly example for Java,
    since the language lacks an abstract numerical tower, which is a very
    concrete deficiency of the language, and doesn't say anything about
    polymorphism being limited with static typing.

    You could probably do that algorithm as elegantly in OcaML (splitting
    between integral and real number types, since those aren't unified in
    the language), or better Haskell which treats all numbers uniformly.
    Both are very, very strictly statically typed languages.

    Your example doesn't prove anything about latent typing at all.

    David Vallner
     
    David Vallner, Aug 25, 2006
    #7
  8. "Simon Forman" <> writes:

    > wrote:
    >> <Java vs. ruby half-argument>

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


    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.
     
    Daniel Martin, Aug 26, 2006
    #8
  9. Re: Duck typing alows true polymorfisim [Hoff Topic]

    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
     
    David Vallner, Aug 26, 2006
    #9
  10. On 8/30/06, athornetdotdemondotnl"@ruby-lang.org Jeroen Wenting
    <"jwenting> wrote:
    >
    > "Simon Forman" <> wrote in message
    > news:...
    > > wrote:
    > >> lets say you want a generic numerical algorithom like sum
    > >>

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

    > 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.

    --
    - Simen
     
    Simen Edvardsen, Aug 30, 2006
    #10
  11. Matt Todd Guest

    Hi ! (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
     
    Matt Todd, Aug 30, 2006
    #11
  12. On 8/30/06, The Ghost In The Machine <00suus7038.net> wrote:

    [ 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!

    --
    Rick DeNatale

    My blog on Ruby
    http://talklikeaduck.denhaven2.com/
     
    Rick DeNatale, Aug 31, 2006
    #12
  13. 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!


    Make it so. =]

    --
    Jeremy Tregunna
     
    Jeremy Tregunna, Aug 31, 2006
    #13
  14. The Ghost In The Machine <00suus7038.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... :)

    > 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.
     
    Tor Iver Wilhelmsen, Aug 31, 2006
    #14
  15. Guest

    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.
     
    , Aug 31, 2006
    #15
  16. Isaac Gouy Guest

    The Ghost In The Machine wrote:
    > In comp.lang.java.advocacy, Tor Iver Wilhelmsen
    > <>
    > wrote
    > on 31 Aug 2006 18:31:15 +0200
    > <>:
    > > The Ghost In The Machine <00suus7038.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.)

    >
    > Aye; my webpage has a similar problem. :)
    >
    > >
    > >> 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. :)
    >
    >
    > >
    > >> 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. :)
    >
    > >
    > >> 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 :) ).
    >
    > >
    > >> 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. :) 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... :)

    >
    > 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.

    >
    > >
    > >> 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. :)
    >
    > >
    > >> 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. :)
    >
    > --
    > #191,
    > Windows Vista. Because it's time to refresh your hardware. Trust us.
     
    Isaac Gouy, Sep 1, 2006
    #16
  17. 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
     
    David Vallner, Sep 1, 2006
    #17
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Duck Typing

    , Sep 16, 2003, in forum: Python
    Replies:
    10
    Views:
    685
    Steve Holden
    Sep 17, 2003
  2. Replies:
    15
    Views:
    568
    Isaac Gouy
    Sep 1, 2006
  3. Replies:
    2
    Views:
    321
    Terry Reedy
    Jan 28, 2008
  4. Paddy
    Replies:
    1
    Views:
    393
    Paddy
    May 9, 2008
  5. bdb112
    Replies:
    45
    Views:
    1,346
    jazbees
    Apr 29, 2009
Loading...

Share This Page