Table of Contents

Reflection describes an objects ability to "reflect" on itself, generally this means to understand it's type and relationships to other types. Although Nada does not boast a robust reflection library it does have a basic typeid for by-value types and property_delegates:

typeid

  var i = 0;
  var di = 0d;
  var real = 0.0;
  var double = 0.0d;
  var word = "";
  var refType = null;
  var boolTrue = true;
  var boolFalse = false;
  var prop = new Property[Real]();        
  
  Console.Write("integer, 0 is of type: ");
  Console.WriteLine(typeid(i).Name);               // integer, 0 is of type: Integer
  Console.Write("doubleinteger, 0d is of type: ");
  Console.WriteLine(typeid(di).Name);              // doubleinteger, 0d is of type: DoubleInteger
  Console.Write("real, 0.0 is of type: ");
  Console.WriteLine(typeid(real).Name);            // real, 0.0 is of type: Real
  Console.Write("doublereal, 0.0d is of type: ");
  Console.WriteLine(typeid(double).Name);          // doublereal, 0.0d is of type: DoubleReal
  Console.Write("string, \"\" is of type: ");
  Console.WriteLine(typeid(word).Name);            // string, "" is of type: String
  Console.Write("null, null is of type: ");
  Console.WriteLine(typeid(refType).Name);         // refTypeHandle, null is of type: Null
  Console.Write("boolean, true is of type: ");
  Console.WriteLine(typeid(boolTrue).Name);        // boolean, true is of type: Boolean
  Console.Write("boolean, false is of type: ");
  Console.WriteLine(typeid(boolFalse).Name);       // boolean, false is of type: Boolean   
  Console.Write("Real property delegate is of type: "); 
  Console.WriteLine(typeid(prop).Name);            // Real property delegate is of type: Property[Real]
  ---------------- Begin Game ---------------
  integer, 0 is of type: Integer
  doubleinteger, 0d is of type: DoubleInteger
  real, 0.0 is of type: Real
  doublereal, 0.0d is of type: DoubleReal
  string, "" is of type: String
  null, null is of type: Null
  boolean, true is of type: Boolean
  boolean, false is of type: Boolean
  Real property delegate is of type: Property[Real]

String Interpolation

Those types that are memory_management or delegates types can be inspected with string Interpolation:

class Utility
{
  constructor()
  {
  }
  [Static]
  function HelloWorld()
  {
    Console.WriteLine("Hello World");
  }
  
  function Add(a: Integer, b: Integer): Integer
  {
    return a+b;
  }
}

class Driver 
{
  function TypeidForRefAndDelegates()
  {
    var del = Utility.HelloWorld;
    var temp = new Utility();
    var del2 = temp.Add;
    var vectorRef = new Real3(0.0, 1.0, 2.0);

    Console.Write("delegate(), Utility.HelloWorld can be string interpolated to read: "); 
    Console.WriteLine("`del`");
    
    Console.Write("delegate(a:Integer, b:Integer):Integer, Utility.Add");
    Console.Write(" can be string interpolated to read: ");
    Console.WriteLine("`del2`");

    
    Console.Write("ref Real3, (0.0, 1.0, 2.0) is of type: ");
    Console.WriteLine("`vectorRef`");
  }
}
---------------- Begin Game ---------------
delegate(), Utility.HelloWorld can be string interpolated to read: Utility.HelloWorld()
delegate(a:Integer, b:Integer):Integer, Utility.Add can be string interpolated to read: 
Utility.Add(a : Integer, b : Integer) : Integer
ref Real3, (0.0, 1.0, 2.0) is of type: ref Real3

Console.DumpValue

Useful in understanding the current state of a Nada object, Console.DumpValue prints out the names of the variables and their type, if a class, or their value if a basic, built-in data type.

class TopLevel
{
  var MyVariable: MidLevel = null;
  constructor()
  {
  }
}

class MidLevel
{
  var MyVariable: BottomLevel = BottomLevel(false);
  constructor()
  {
  }
}

struct BottomLevel
{
  var IsBottom: Boolean = true;
  var UpAxis: Real3 = Real3(0.0, 1.0, 0.0);
  constructor(param: Boolean)
  {
    this.IsBottom = param;
  }
}
    
class ReflectionDriver
{
  [Static]
  function Dumping()
  {
    var top = TopLevel();
    var mid = MidLevel();
    var bot = BottomLevel(true);
    
    Console.DumpValue(top);
    Console.DumpValue(mid, 8); // The second parameter indicates the depth of recursion cut-off
    Console.DumpValue(bot);
    
  }
}
---------------- Begin Game ---------------
TopLevel
  MyVariable: (null) MidLevel
MidLevel
  MyVariable: BottomLevel
    IsBottom: False
    UpAxis: (0, 1, 0)
      X: 0
      Y: 1
      Z: 0
BottomLevel
  IsBottom: True
  UpAxis: (0, 1, 0)

Notice how the MidLevel dumps more information than the BottomLevel with comparable information, due to the second parameter.

Related Materials

Manual