I Compile-time resolution
=========================

1. an isolated name, where the argument is implicitly determined by the result context

@max

2. a direct application to a manifest type

@max( int )

3. constraining a type variable; the application is implicitly performed at the call site as in (2)

forall( type T | { T @max( T ); } ) T x( T t );


II Run-time resolution
======================

1. an indirect reference, where the argument is implicitly determined by the result context

attr_var = &@max;
x = (*attr_var);

2. an indirect application to a manifest type

(*attr_var)( int )

3. a direct application to a type variable

@max( T )

Under what circumstances can this be done at compile/link time?


III Declaration forms
=====================

1. monomorphic with implicit argument

int @max;

2. monomorphic with explicit argument

int @max( int );

3. polymorphic

forall( type T | constraint( T ) ) int @attr( T );
