D

Chris Nicholson-Sauls ibisbasenji at gmail.com
Sun Apr 16 14:03:05 PDT 2006


Comments imbedded.

N wrote:
> I love the idea of D language.
> But I think it misses some usefult points.
> 
> 1.
> There is no compile-time reflection.

I agree with the usefulness of reflection (and have actually been secretly working on a
proof-of-concept reflection system) but I don't see much value in your proposed mechanism:

> E.g. one could write:
> [d]
> class a
> {
> void f() {}
> int i;
> }
> 
> int a_methods = a.methods.length;

This is fine.

> bool has_a_f = a.has_method(f);

No.  For one thing, you can't pass 'f' as an orphaned symbol like this.  It creates a
context-sensitive parsing nightmare.  Instead, my proposal would offer these:
# (a.method(`f`c) != null)
# a.method_exists(`f`c)

> int a_variables = a.variables.length;

This is fine, except I prefer to use the term Field for reflection, rather than Variable.

> bool has_a_i = a.has_variable(i);

Same as above.  Use one of:
# (a.field(`i`c) != null)
# a.field_exists(`i`c)

> 
> // Or even
> class b
> {
> void g();
> }
> 
> type a_f_type = a.f.type;
> foreach(auto b_f_type; b.methods)
> if(a_f_type == b_f_type)
> b.b_f_type(); // call b.g
> [/d]

# class Foo {
#   void g () {};
# }
#
# foreach (m; b.methods)       // note there's no need for auto here
#   if (typeof(a.f) == m.type)
#     m();

> 
> 2.
> Make all postfix:
> [d]
> // instead of
> typeof(a) x = 1;
> 
> // write:
> a.type x = 1;

The reason typeof(), typeid(), and is() are this way, as I understand it, is because they
are compile time constructs.  (That and is() couldn't really work elegantly as a postfix.)

> // instead of
> int a = cast(int)('a');
> 
> // write:
> int a = 'a'.cast<int>;
> // or if we have static_cast :)
> int a = 'a'.static_cast<int>;
> [/d]

No <>'s please.  Parsing badness, and it just doesn't stand out quite as well to me as !()
does.  Plus, cast is not a function to be templated, it is a language construct in the
same family as typeof() et al.  We have little utility for static_cast, dynamic_cast, etc.
  They just aren't as neccessary in D, so far as I have seen.

> 3.
> Extensible Metainformation:
> E.g.
> [d]
> class a
> {
> meta
> {
> bool is_a = true;
> }
> }
> 
> meta // For all types
> {
> bool is_a = false;
> }
> 
> a x;
> int y;
> 
> static_assert(x.is_a == true);
> static_assert(y.is_a == false);
> [/d]

That could be nifty.  I think I remember seeing one or two similar proposals -- might be
worth searching the newsgroup and compiling it all together for discussion?

> 4.
> Make built-in types likely to object types.

Eh?  Explain?

> 5.
> 'auto' keyword problem resolution.
> auto x = new a(); // auto type, or auto destructor ?

In this case, auto type, because their is no type given.  Not that hard to distinguish.

> E.g.:
> [d]
> auto a x = new a(); // destrutor
> var x = new a(); // auto type
> auto var x = new a(); // auto type + destructor
> [/d]

I'm for it.

> 6.
> C syntax for templates.
> It's so natural.

First -- I think you mean C++ templates don't you?  Seeing as how C has none.  Second --
you are joking, yes?

# template afind (T : T[]) {
#   size_t afind (T needle, T[] haystack) {
#     foreach (i, x; haystack) {
#       static if (is(T : Object)) {
#         if (x is needle)
#           return i;
#       }
#       else {
#         if (x == needle)
#           return i;
#       }
#     }
#     return -1;
#   }
# }
#
# static int[] foo = [42, 314, 27, 82, 12, 9];
#
# size_t idx27 = afind(27, foo); // idx27 == 2

Of course this example assumes function template type inference is working -- which I
think it would already for this example.  If it isn't working yet, then:

# size_t idx27 = afind!(int[])(27, foo);

Still not bad.  Or, if you want to get super generic:

# auto idx27 = afind!(typeof(foo))(27, foo);

Of course, usually somewhere this has already been done:

# alias afind!(int[]) afind;

Which makes the first invocation method work even without inference.  Yipee, as they say.

> 7.
> More casts.
> E.g. 
> static_cast
> dynamic_cast
> reinterpret_cast // make it safe, error if size of arguments is different
> pointer_cast

No no no.  No use, just more typing.  Casting is all about subverting the type system for
a moment anyhow.

> 
> 8.
> implicit 'new'.
> E.g.
> [d]
> a x(...); // same as , a x = new a(...)
> // same as , auto x = new a(...)

What do you do if you want a static opCall?  And is this on the heap or on the stack?  Too
many questions, too little use, and what about on-the-fly instantiations?

-- Chris Nicholson-Sauls



More information about the Digitalmars-d mailing list