use strict;
use Inline 'SLang';
use Data::Dumper;

# this is not meant to be a robust, general purpose, printing routine!
sub printval ($;$);
sub printval ($;$) {
  my $x     = shift;
  my $depth = shift || 0;

  my $ref   = ref($x);
  my $spacer = '  ' x $depth;
  unless ( $ref ) {
    print "${spacer}Scalar: $x\n";
    return;
  }

  if ( $ref eq "ARRAY" ) {
    print "${spacer}Array:\n";
    print "${spacer}  " . Dumper($x) . "\n";
    return;
  }

  if ( $ref eq "Struct_Type" ) {
    print "${spacer}Struct_Type:\n";
    while ( my ( $field, $val ) = each %{$x} ) {
      print "${spacer}  field $field contains\n";
      printval( $val, $depth+2 );
    }
    return;
  }

  if ( $ref eq "Assoc_Type" ) {
    my $type = $x->_typeof;
    print "${spacer}Assoc_Type [$type]:\n";
    while ( my ( $field, $val ) = each %{$x} ) {
      print "${spacer}  key '$field' contains\n";
      printval( $val, $depth+2 );
    }
    return;
  }

  print "${spacer}Object: $x\n";

} # sub: printval

foreach my $perlval ( bar() ) { printval($perlval); }

__END__
__SLang__

define bar () {
  variable x = struct { foo, bar };
  x.foo = 1;
  x.bar = Assoc_Type [String_Type];
  x.bar["a a"]     = "a string";
  x.bar["flibble"] = "another string";
  return ( 1, 2.3, ["an","array","of strings"], x, 4-3i );
}
