On Sat, 06 Nov 2010 14:48:44 -0400
bearophile <[email protected]> wrote:
> spir:
>
> > What is the common idiom to check whether the type of a given element is
> > what I expect?
> > Seems that
> > typeof(e) == Type
> > is refused by the compiler, for any reason? I get
> > DeeMatch.d(237): Error: type string is not an expression
>
> I don't know why the language refuses a natural and more clean syntax like:
> if (typeof(x) == Type) {...
> I think it's to keep the compiler simple, clearly telling apart the
> compile-time phase that uses types (or CTFE) from the run-time that uses
> values.
> So you have to wrap it into a is(), often this is enough:
> if (is(typeof(x) == Type)) {...
> But look in the docs at the complex syntax of is() for the many other
> different ways to use it.
Right.
I looked at 'is' before, precisely. But there does not seem to be any direct
idiom to test a variable's type. At least, the book TDPL does not show any. It
shows only operations on types themselves (without any var). I'll check your
proposal ==> works, thanks!
> > Also, how to override a class's field so that it is accessed according
> > actual/runtime type? (Like method dispatch.)
>
> This feature is named "double dispatch", and it's present in the object
> system named CLOS of CommonLisp, but unfortunately it's not present in D (or
> C++, Java, Python). Maybe the Scala language too has this feature. See:
> http://en.wikipedia.org/wiki/Double_dispatch
> http://en.wikipedia.org/wiki/Visitor_pattern
>
> The D language allows you to perform the dispatch only on the compile time
> type of the arguments (or the dynamic type of the "this"). This means that if
> you have to perform double dispatch in D/C++/Python, then you need to
> implement/simulate this feature manually. There are several ways to do it,
> see . In some situations if your program needs to use double dispatch
> heavily, then you may invent a string mixin to reduce somehow the boilerplate
> code.
>
>
> > void method (SuperType x) {...access x.f...}
> > If I don't define f in SuperType, then I get a compiler error. If I do,
> > then SuperType.f is accessed, not the field on actual class of x.
>
> D is a statically typed language, this means that in general the choices
> about types (this mean choice of code path or code generation by templates)
> are performed only at compile time.
>
> Despite languages like Java and D are statically typed, they allow a bit of
> dynamic typing, using the virtual table of the classes, and allowing run-time
> types of objects to differ from their compile-time type. But this bit of
> dynamic typing is limited and is not extended to double/multiple dispatch (on
> the other hand even very dynamic languages like Python lack double or
> multiple dispatch).
Hem, I'm not sure it's double dispatch. What I mean works in many languges,
including python, Lua, and I guess OO langs of the Pascal family. Just this:
class SC {
string f = "SC";
void show() {writeln(this.f);}
}
class C : SC {
string f = "C";
}
void main () {
auto c = new C();
writeln(c.f) ; // OK, got "C"
c.show() ; // expected "C", got "SC"
// below test for type
if (is(typeof(c) == C)) {writeln("type C");} else {writeln("type SC");}
auto sc = new SC();
if (is(typeof(sc) == C)) {writeln("type C");} else {writeln("type SC");}
}
It's not double dispatch, I guess, but exactly the same dispatch on
actual/runtime type for fields as we have for methods. And it woeks for sure in
python (and many other languages):
class SC:
f = "SC"
def show(self):
print self.f
class C (SC):
f = "C"
c = C()
print c.f # OK, got "C"
c.show() # OK, got "C" as well
Well, actually, I don't need the feature anymore for the present use case, as
it was only to work around the above issue (had a "typename" field). But I
would still like to find a way of having fields accessed according actual type,
or know for sure that it's impossible (and 'why" in option ;-).
I guess it may be so because field access is resolved at compile-time, unlike
method access. (Meaning so-to-say "zero-dispatch" for fields, while we have
single-dispatch for methods.) In dynamic languages, indeed, both are resolved
at runtime. But, if I'm right on this, the D way surely is a big gain in
efficiency.
Thank you, anyway,
Denis
-- -- -- -- -- -- --
vit esse estrany ☣
spir.wikidot.com