From: Brian I. <in...@tt...> - 2001-11-10 07:39:10
|
Hi guys, I don't want to rain on our parade, but I thought of some tough use cases that I'm not sure can be serialized in YAML. They are actually pretty straight-forward structures conceptually. Data::Dumper can handle them, but it ain't pretty. Here we go: The first is a 3 element sequence of references. Slot zero refers to slot 1, slot 1 refers to slot 2, slot2 refers to slot 0. A YAMLesque representation would be: - &001 *002 - &002 *003 - &003 *001 The problem here is that I've used forward pointing references. Data::Dumper uses only backward references, but it's hairy: > perl -MData::Dumper -e '$a=[];$a->[0]=\$a->[1];$a->[1]=\$a->[2];$a->[2]=\$a->[0];print Dumper $a' $VAR1 = [ \\\$VAR1->[0], ${$VAR1->[0]}, ${${$VAR1->[0]}} ]; This is akin to the following in YAML: - &001 &&&{&001} - **001 - ***001 Or something like that. My brain hurts :( --- Now take the same structure but replace slot 1 with 'foo'. You get: - &001 foo - *002 - &002 *001 In Perl: > perl -MData::Dumper -e '$a=[];$a->[0]="foo";$a->[1]=\$a->[2];$a->[2]=\$a->[0];print Dumper $a' $VAR1 = [ 'foo', \\$VAR1->[0], \$VAR1->[0] ]; --- I think our reference model is oversimplified and flawed. I'm having a hard time think clearly about it right now. I just had 3 beers and a coffee. Here's a couple of simpler examples using Data::Dumper: > perl -MData::Dumper -e '$a=[qw(foo bar)];$a->[0]=\$a->[1];print Dumper $a' $VAR1 = [ \'bar', ${$VAR1->[0]} ]; > perl -MData::Dumper -e '$a=[qw(foo bar)];$a->[1]=\$a->[0];print Dumper $a' $VAR1 = [ 'foo', \$VAR1->[0] ]; Perl can get away with always using backwards refs because it shows the actual data early if necessary.Do we want that for YAML? In a forward reference enabled YAML these might be: --- - *001 - &001 bar --- - &001 foo - *001 Help, Brian |
From: Brian I. <in...@tt...> - 2001-11-10 19:57:55
|
On 09/11/01 23:39 -0800, Brian Ingerson wrote: > Hi guys, > > I don't want to rain on our parade, but I thought of some tough use cases > that I'm not sure can be serialized in YAML. They are actually pretty > straight-forward structures conceptually. Data::Dumper can handle them, but > it ain't pretty. Here we go: > > The problem here is that I've used forward pointing references. Data::Dumper > uses only backward references, but it's hairy: > > > perl -MData::Dumper -e > '$a=[];$a->[0]=\$a->[1];$a->[1]=\$a->[2];$a->[2]=\$a->[0];print Dumper $a' > $VAR1 = [ > \\\$VAR1->[0], > ${$VAR1->[0]}, > ${${$VAR1->[0]}} > ]; --- - !reflist &001 - &002 *001 - &003 *002 - *003 - *003 - *002 > > perl -MData::Dumper -e > '$a=[];$a->[0]="foo";$a->[1]=\$a->[2];$a->[2]=\$a->[0];print Dumper $a' > $VAR1 = [ > 'foo', > \\$VAR1->[0], > \$VAR1->[0] > ]; --- - &001 foo - !reflist - &002 !reflist - *001 - *002 - *001 Eeek. This one is actually harder than the others. I'm not sure I got it right. Let's expand: $a->[0] = 'foo'; $a->[$_] = \$a->[$_+1] for 1..8; $a->[-1] = \$a->[0]; print Dumper($a); $VAR1 = [ 'foo', \\\\\\\\\$VAR1->[0], ${$VAR1->[1]}, ${${$VAR1->[1]}}, ${${${$VAR1->[1]}}}, ${${${${$VAR1->[1]}}}}, ${${${${${$VAR1->[1]}}}}}, ${${${${${${$VAR1->[1]}}}}}}, ${${${${${${${$VAR1->[1]}}}}}}}, \$VAR1->[0] ]; OK. That looks better actually.` - &001 foo - !reflist - &002 *001 - &003 *002 - &004 *003 - &005 *004 - &006 *005 - &007 *006 - &008 *007 - &009 *008 - *009 - *008 - *007 - *006 - *005 - *004 - *003 - *002 - *001 So I guess the previous one woud be: - &001 foo - !reflist - &002 *001 - *002 - *001 > I think our reference model is oversimplified and flawed. I'm having a hard > time think clearly about it right now. I just had 3 beers and a coffee. Nope. Just good beer! (Actually this stuff has been looming in the back of my mind for a while. I think the beer just made me crazy enough to take it head on.) > Here's a couple of simpler examples using Data::Dumper: > > > perl -MData::Dumper -e '$a=[qw(foo bar)];$a->[0]=\$a->[1];print Dumper $a' > $VAR1 = [ > \'bar', > ${$VAR1->[0]} > ]; - !reflist - &001 bar - &002 *001 - *002 - *001 > > > perl -MData::Dumper -e '$a=[qw(foo bar)];$a->[1]=\$a->[0];print Dumper $a' > $VAR1 = [ > 'foo', > \$VAR1->[0] > ]; - &001 foo - *001 I wish they were all that easy. > Perl can get away with always using backwards refs because it shows the > actual data early if necessary.Do we want that for YAML? Looks like it. Cheers, Brian |