#!/usr/bin/perl -w package Do_notation; use strict; use Filter::Simple; my $lhs = qr{(.*)}s; my $rhs = qr{(.*)}s; my $lambda = qr{$lhs <- $rhs}x; my $do_term = qr[DO.*?{(.*?)}]s; FILTER { s/$do_term/fix_it($1)/esg }; ### code only has problems with parsing perl (no surprises) #FILTER_ONLY code => sub {s/$do_term/fix_it($1)/esg }; sub fix_it { my $exception = chr(28); #print STDERR $_[0]; print STDERR "XXXXXXX\n"; (my $strip_newlines = $_[0]) =~ s/\n+(?!$exception)//g; my @statements = split /;/, $strip_newlines; my @new_front; my @new_back; for (@statements) { if(m/$lambda/) { push @new_front, "Bind($2)->(sub{$1=shift;\n"; unshift @new_back, "})"; } elsif(m/(.*)/) { push @new_front, $1; push @new_front, "\n"; } else { die "syntax error\n"; } } #print STDERR join "",(@new_front,@new_back,""); print STDERR "------------\n"; return join "",(@new_front,@new_back,""); } 1;