// Test various permutations of ?=
proc iap(obj, cls) {return obj ?= cls;}

proc main()
{
    var typ = {Int, Float, Array[*], Array,            String,  PackInt,
               Array[2,3],       String[3], PackInt[5]};
    var cap = {" ", "Int", "Flt", "Arr*", "Arr", "Str", "PkI",
               "Arr23", "Str3", "Pki5"};
    var val = {3,   4.0,   {1,2},    nil.reshape(1,3), "hello", [1,2,3],
               nil.reshape(2,3), "lo!",     [1,2,3,4,5]};
    var str = {3,   4.0,   "{1,2}",  "nil.reshape(1,3)", "hello", "[1,2,3]",
               "nil.reshape(2,3)", "lo!",     "[1,2,3,4,5]"};
    var res = new Array(10,10);
    var outr;

    // Compute the outer product of the vals and the types
    outr = val.outer(iap, typ);

    // Create the formatted array
    res[0,0:] = cap;                    // First row is captions
    res[1:,0] = str;                    // First column is string vers of vars
    res[1:,1:] = " Y"[outr];            // Guts are reformatted result

    // Print it out. 'SN#' - don't do nest boxes. 'S*' - print literals in
    // every row. '*' - loop format here. 'SC' - center values in column.
    // ':' - terminate after row is exhausted
    print("SN#, S*, V, ' | ', (*, SC, V, :, ' | ')", res);
}