On 2008-11-26 17:49:45 -0500, "Stewart Gordon" <[EMAIL PROTECTED]> said:

"Michel Fortin" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED]
<snip>
Here, valueTypeOf is a function taking a type as argument and returning another type. Obviously, it's a function that can only be evaluated at compile-time, but with it we can just forget about using templates and declarative programming when we need to create variables of related types.

If it can only be evaluated at compile-time, ISTM it isn't really types being first-class values. Your idea is an attempt to capture the power of templates without using templates, whereas a real system of types as first-class values would be more powerful than this.

Well, being able to work with types at runtime implies many things, and I didn't want to make it seem like any runtime support is needed to implement what I'm proposing. Also, I haven't thought about everything that is needed to fully replace templates with functions.

I'll bring back something that was proposed a while ago: static arguments for functions. Static arguments were supposed to instanciate code for the function for each value you'd pass to the given argument, much like a template argument would do. Here's how you can use this to create a function that return a type parametrized to a given argument:

        type foo(static int a) {
                class C {
                        int opCall() {
                                return a;
                        }
                }
                return C;
        }

Which could replace this:

        template bar(int a) {
                class bar {
                        int opCall() {
                                return a;
                        }
                }
        }

There's also a difference in the instanciation syntax:

        foo(1) a;
        bar!(1) b;

Now you can implement "headconst(Object)" in a library. :-)


[exit dream mode]

Not sure what all this would entail, but if we could return types from functions, would we still need templates at all? Couldn't we just create any struct or class inside the function and return that?
<snip>

We might no longer need templates for functions or type aliases, but I think that we would still need class/struct templates. You could invent a notation to construct a class or struct within a function, but I'm not sure that you can make it look as nice as the template notation we already have.

Yes, I agree. The "class A(arguments) {}" and "struct B(arguments) {}" syntax should be kept. But then it should also be harmonised to use the same parameter naming convention as functions. Basically:

        class A(type T) { ... }

could become a shortcut for function:

        type A(type T) { class A { ... }; return A; }

instead of:

        template A(T) { class A { ... } }

And it could be instanciated like this:

        A(int) a;


Whether you want types to be full first-class values manipulable at runtime or merely entities that you can manipulate using CTFE, one implication is that type syntax and expression syntax would merge into one common syntax. This might make parsing simpler, but you would have to work out how to deal with such funny things as that * is postfix for types and prefix for expressions, but [] is postfix for both.

I'm mostly interested in CTFE, at least for now.

It's true that parsing postfix * may be an interesting problem. "foo(x) * a" has a totally different meaning depending on foo(x) giving you a type or a value. If I'm not mistaken, fixing this would imply breaking separation of syntaxic and semantic analysis in the compiler, probably not something Walter will be interested in.


I thought a while back about the possibility of giving types first-class citizenship. I suppose that what it really means is that a type used as an expression would become the TypeInfo for that type. But the TypeInfo classes probably ought to have more human-readable names - Type, ArrayType, ClassType, AAType, etc. And some properties specific to each of these, e.g. valueType for ArrayType and AAType, eliminating the need for the valueTypeOf function you proposed.

Seems you want runtime reflection. :-)


--
Michel Fortin
[EMAIL PROTECTED]
http://michelf.com/

Reply via email to