Metaprogramming with Types and Kinds

Types and Kinds can be accessed by the programmer for metaprogramming.

let unique_type_count() = count(
   for $s in $
   for $e in $s
   yield $$e
);

Here we count the number of unique Types in a program. $ is the set of all symbols defined in the current namespace. Each $s is a top-level AST node. Each $e is a local-level AST node. $$e is the type of $e. Then the count function counts the number of unique types in the list.

let unique_kind_count() = count(
   for $s in $
   for $e in $s
   yield $$$e
);

Here we count the number of unique Kinds in a program. $ is the set of all symbols defined in the current namespace. Each $s is a top-level AST node. Each $e is a local-level AST node. $$$e is the kind of $e.