DIP64: Attribute Cleanup
Brian Schott via Digitalmars-d
digitalmars-d at puremagic.com
Fri Jun 20 13:34:17 PDT 2014
On Friday, 20 June 2014 at 19:48:49 UTC, H. S. Teoh via
Digitalmars-d wrote:
> First, there is no way to mark a function as *impure* as
> opposed to pure
> (leaving out "pure" is not an option in template functions due
> to
> automatic attribute inference). Also, there's an inconsistency
> between
> positive attributes (pure, safe) vs. negative attributes
> (nothrow,
> nogc). So ideally, the new syntax should allow you to specify
> both pure
> and impure, and ideally, it should not special-case on
> peculiarities of
> the English language (pure/impure vs. throw/nothrow). So it
> should be
> something like @pure, @!pure, @throw, @!throw, @gc, @!gc, etc.,
> for
> maximum consistency.
I can see this being useful. We'd just have to decide what it
means to negate an attribute with arguments. (e.g.
`@!name("bob")`)
Also in the case of @!throw we'd have to modify the definition of
attributes to accept the "throw" token instead of just
identifiers. Maybe converting "nothrow" to "@!throws" would be
better.
> I also like your attribute sets idea. This could be the
> solution we're
> looking for with transitive attributes (aka inout(pure),
> inout(nothrow),
> etc.). If there was some syntax for attribute set intersection,
> say
> @a*@b, then we could specify that the attribute set of some
> given
> function f() is the intersection of the attribute sets of its
> input
> delegates. For example:
>
> // This is hypothetical syntax, I'm sure you can think of a
> // better way to write this.
> int dgCaller(int delegate(int) @a dg1, int delegate(int) @b
> dg2)
> @this = @a*@b // specifies that this function's
> // attributes is the intersection of @a and @b
> {
> if (someCondition)
> return dg1(1);
> else
> return dg2(2);
> }
>
>
> T
Is that use case common enough to justify complicating the
compiler?
More information about the Digitalmars-d
mailing list