On Sat, Apr 28, 2012 at 11:12:38PM +0200, SomeDude wrote:
> On Saturday, 28 April 2012 at 20:59:48 UTC, q66 wrote:
> >
> >This kind of attitude "we need big fat bullshit like Java and
> >heavy use of OO and idioms and EH and all that other crap" is
> >broken and false. And you have no way to prove that Python for
> >example wouldn't scale for large projects; its main fault is that
> >the default implementation is rather slow, but it's not pretty
> >much missing anything required for a large project.
> 
> Python has two big drawbacks for large projects:
> - it's too slow
> - it's a dynamically-typed language
> 
> The fact that it's flexible is because it uses duck typing, and
> AFAIK you can't do duck typing in a statically typed language.
> So it's cool for small programs, but it can't handle large ones
> because it's not statically typed. And this opinion doesn't come
> just out of thin air, I speak from my own professional experience.

Who says D doesn't have duck-typing?

        template isADuck(T) {
                alias isADuck = is(typeof(T.quack())==bool);
        }

        void petADuck(T)(T duck)
                if (isADuck!T)
        {
                duck.quack();
        }

You can pass anything that has a quack() method to the function:

        struct CanadianDuck {
                void quack() { writeln("Quack, eh?"); }
        }

        class AmericanDuck {
                void quack() { writeln("Quack, yo!"); }
        }

        struct RubberDuck {
                void opDispatch!(string S)()
                {
                        auto d = loadRuntimeDuckClass();
                        d.callMethod(S);
                }
        }

        struct Cow {
                void moo() { writeln("Mooo!"); }
        }

        void main() {
                CanadianDuck caddie;
                AmericanDuck quacker = new AmericanDuck;
                RubberDuck runtimeDuck;
                Cow orker;

                // Look, ma! I hez duck-taiping!
                petADuck(caddie);
                petADuck(quacker);
                petADuck(runtimeDuck);

                // Reject non-duck objects
                petADuck(orker);        // compile error: orker is not a duck!
        }

Not only D supports duck-typing, the compiler even checks type-safety
for you at compile-time. ;-)

Incidentally, this is what the Phobos range interface does.


T

-- 
My program has no bugs! Only undocumented features...

Reply via email to