include can be called multiple times, but a static foreach should be expanded at most once. Achieved by caching the result of the first call. We need both cached and cache, because null is a valid value for cache.
Create a new scope if one or more given attributes are different from the sc's. If the returned scope != sc, the caller should pop the scope after it used.
A hook point to supply scope for members. addMember, setScope, importAll, semantic, semantic2 and semantic3 will use this.
Static foreach at declaration scope, like: static foreach (i; [0, 1, 2]){ }