Proposal: First class types (at compiletime)
Commander Zot
no at no.no
Fri Jul 21 11:39:59 UTC 2023
On Friday, 21 July 2023 at 08:52:47 UTC, Quirin Schroll wrote:
> On Thursday, 20 July 2023 at 13:44:15 UTC, Commander Zot wrote:
>> wouldn't it be possible to have something like first class
>> types (at compile time) to replace tamplates for type logic
>> with regular functions executed at CTFE?
>
> Of course, that’s possible. You’d have a type called `Type`
> that represents types. Of course, `Type` does not actually
> exist, a function that takes `Type` parameters or returns
> `Type` cannot end up in the object file. But for CTFE, the
> compiler can pretend that `Type` is just a type like `Object`.
>
> In my imagination, you’d have a transformation from “actual”
> types (as per D’s grammar) to `Type` objects. For built-in
> types, object.d could provide predefined variables, like `Int`
> for `int`: `Int` is an object of type `Type` that represents
> `int`. It could be a built-in pseudo-template `type!T()` that
> returns the `Type` for `T` or maybe the transformation can be
> applied even implicitly; object.d would contain `enum Int =
> type!int;` and friends.
>
> The `Type` objects can be manipulated with regular functions
> and function templates. At CTFE, `Type` is just a type.
>
we already have TypeInfo, which should be used for this too. i'd
just add a alias type_t or something.
> To get “actual” types back from a `Type` object at compile
> time, you need another mechanism, ideally I’d say, use `mixin`.
>
> Instead of `int x;` you could `mixin(Int) x;`.
>
I don't see how that would be useful. it's like restricting an
int parameter to specific values. it can be done in the function
body.
> D’s templates are expressive enough to implement every function
> you could use `Type`, so it’s technically redundant, and not
> everything that can be expressed using templates can (or
> should) be done by (CTFE-only) functions with `Type`;
> essentially every non-alias template is an example. On the
> other hand, in the current state, every algorithm that could be
> applied to types (like sorting a bunch of types) must be
> implemented in templates because the value algorithm cannot be
> used. That I call redundancy.
>
> As a rule of thumb, if you want to *manipulate* types like a
> puppet master, you’d use a `Type` function; if you’re
> interested in *using* the types, e.g. handling objects that
> have that type, you’d use good old templates.
excatly. and i'm really tired of writing recursive functions for
those things.
More information about the Digitalmars-d
mailing list