#!/usr/bin/env perl # "The structure of PostScript with the quoting horrors of m4." %a =('df', sub { push @{$d{$s[$#s-1]}}, join ' ', @s[($#s-$s[$#s]-1)..($#s-2)]; pop @s for( 1..($s[$#s]+2) ) }, 'ud', sub { pop @{$d{pop @s}} }, 'sl', sub { pop @s }, 'rd', sub { open R, pop @s; e(split) for( ) }, 'pt', sub { print pop @s, "\n" }, 'ex', sub { exit pop @s }, 'gn', sub { $b = 1 }, 'gf', sub { $b = 0 }, 'ps', sub { print "@s\n" }, 'dk', sub { print "$_ => ", ${d{$_}}[$#d], "\n" for( keys %d ) }, '?', sub { if( pop @s ) { pop @s; e(pop @s) } else { $q = pop @s; pop @s; e($q) } }, '+', sub { push @s, (pop @s) + (pop @s) }, '*', sub { push @s, (pop @s) * (pop @s) }, '>', sub { push @s, (pop @s) < (pop @s) ? 1 : 0 }, '<', sub { push @s, (pop @s) > (pop @s) ? 1 : 0 }, '=', sub { push @s, (pop @s) == (pop @s) ? 1 : 0 }, '-', sub { push @s,-(pop @s) } ); sub e { for( @_ ) { if( $b ) { printf "%13s | ", $_; print "@s\n" } if( defined $a{$_} ) { &{$a{$_}} } elsif( /\d+/ ) { push @s, $_ } elsif( /$\'/ ) { s///; push @s, $_ } #')# stupid emacs elsif( defined $d{$_} ) { e(split /\s+/, ${$d{$_}}[$#d]) } } } e(split) while( <> );