Index: libcfa/src/containers/array.hfa
===================================================================
--- libcfa/src/containers/array.hfa	(revision 63a4b92a1b215265addfc287907ae92a2316f258)
+++ libcfa/src/containers/array.hfa	(revision 403f2875bbc58cdb14c718a07369c09e820a40eb)
@@ -5,8 +5,5 @@
 
 // the inverse of Z(-)
-#define z(Zn) sizeof(Zn)
-
-// if you're expecting a Z(n), say so, by asking for a ztype, instead of dtype or otype
-#define ztype(Zn) Zn & | sized(Zn)
+#define z(N) sizeof(N)
 
 forall( T & ) struct tag {};
@@ -19,32 +16,32 @@
 //
 
-forall( ztype(Zn), ztype(S), Timmed &, Tbase & ) {
+forall( [N], [S], Timmed &, Tbase & ) {
     struct arpk {
-        S strides[z(Zn)];
+        S strides[z(N)];
     };
 
-    Timmed & ?[?]( arpk(Zn, S, Timmed, Tbase) & a, ptrdiff_t i ) {
+    Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, ptrdiff_t i ) {
         return (Timmed &) a.strides[i];
     }
 
-    Timmed & ?[?]( arpk(Zn, S, Timmed, Tbase) & a, int i ) {
+    Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, int i ) {
         return (Timmed &) a.strides[i];
     }
 
-    Timmed & ?[?]( arpk(Zn, S, Timmed, Tbase) & a, size_t i ) {
+    Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, size_t i ) {
         return (Timmed &) a.strides[i];
     }
 
-    size_t ?`len( arpk(Zn, S, Timmed, Tbase) & a ) {
-        return z(Zn);
+    size_t ?`len( arpk(N, S, Timmed, Tbase) & a ) {
+        return z(N);
     }
 
     // workaround #226 (and array relevance thereof demonstrated in mike102/otype-slow-ndims.cfa)
-    void ?{}( arpk(Zn, S, Timmed, Tbase) & this ) {
-        void ?{}( S (&inner)[z(Zn)] ) {}
+    void ?{}( arpk(N, S, Timmed, Tbase) & this ) {
+        void ?{}( S (&inner)[z(N)] ) {}
         ?{}(this.strides);
     }
-    void ^?{}( arpk(Zn, S, Timmed, Tbase) & this ) {
-        void ^?{}( S (&inner)[z(Zn)] ) {}
+    void ^?{}( arpk(N, S, Timmed, Tbase) & this ) {
+        void ^?{}( S (&inner)[z(N)] ) {}
         ^?{}(this.strides);
     }
@@ -58,6 +55,6 @@
 Te mkar_( tag(Te) ) {}
 
-forall( ztype(Zn), ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } )
-arpk(Zn, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(Zn), ZTags ) {}
+forall( [N], ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } )
+arpk(N, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(N), ZTags ) {}
 
 // based on https://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros
@@ -123,15 +120,15 @@
 
 // Base
-forall( ztype(Zq), ztype(Sq), Tbase & )
-tag(arpk(Zq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(Tbase) ) {}
+forall( [Nq], [Sq], Tbase & )
+tag(arpk(Nq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(Tbase) ) {}
 
 // Rec
-forall( ztype(Zq), ztype(Sq), ztype(Z), ztype(S), recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(recq) ); } )
-tag(arpk(Z, S, recr, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(arpk(Z, S, recq, Tbase)) ) {}
+forall( [Nq], [Sq], [N], [S], recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(recq) ); } )
+tag(arpk(N, S, recr, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(arpk(N, S, recq, Tbase)) ) {}
 
 // Wrapper
 struct all_t {} all;
-forall( ztype(Z), ztype(S), Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(Z), tag(S), tag(Te) ); } )
-result & ?[?]( arpk(Z, S, Te, Tbase) & this, all_t ) {
+forall( [N], [S], Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(N), tag(S), tag(Te) ); } )
+result & ?[?]( arpk(N, S, Te, Tbase) & this, all_t ) {
     return (result&) this;
 }
