[PRL] How about Tues 200-300 for macro reading group?

Matthias Felleisen matthias at ccs.neu.edu
Mon Sep 13 19:16:36 EDT 2004


Yuckldiduck.

On Sep 13, 2004, at 6:21 PM, Jeffrey D Palm wrote:

> Matthias Felleisen wrote:
>
> > I got pretty sick staring at Perl, so I rewrote the program in Pretty
> > Big. It's 2 lines longer, argh. Anyone who knows more about our
> > libraries? -- Matthias
>
> you could stare at this, it converts the (slightly modified, below)  
> perl into java...
>
> #!/usr/bin/perl
>
> print <<HERE;
> public class Constraints {
>   public static void main(String[] args) {
> HERE
>
> while (<>) {
>
>     chomp;
>
>     # @days = (mon, tue, wed, thu, fri);
>     if (m/days = (.*);/) {
> 	my $days = $1;
> 	my $day_strings = $days;
> 	$day_strings =~ s/[()]/\"/g;
> 	$day_strings =~ s/,/\",/g;
> 	$day_strings =~ s/, /, \"/g;
> 	println("    String[] days = {$day_strings};");
> 	println("    java.util.Map constraints = new java.util.HashMap();");
>     }
>
>     elsif (m/^\#(.*)/) {
> 	my $ln = $1;
> 	println("// $ln\n");
>     }
>
>     # mon => ['1200','1330' , '1330','1445' , ],
>     elsif (m/(\S+)\s*=>\s*\[(.*)\]/) {
> 	my $day = $1;
> 	my $innards = $2;
> 	$innards =~ s/\'/\"/g;
> 	println("    constraints.put(\"$day\", new String[]{$innards});");
>     }
>
>     #$start_hour = 8;
>     elsif (m/^\$(.*)/) {
> 	my $rest = $1;
> 	println("    int $rest");
>     }
>
>     #print "\n";
>     elsif (m/print\s*(.*);/) {
> 	my $rest = $1;
> 	$rest =~ s/\./+/g;
> 	$rest =~ s/eq/==/;
> 	$rest =~ s/\: /\: \"\"+/g;
> 	println("  System.out.print($rest);");
>     }
>
>     #for (my $h = $start_hour; $h <= $stop_hour; $h++) {
>     elsif (m/for\s*\(my(.*)/) {
> 	my $rest = $1;
> 	$rest =~ s/\#(\w+)/$1.length-1/;
> 	println("for (int $rest");
>     }
>
>     #    my $hour = $h < 10 ? 0 . $h : $h;
>     elsif  
> (m/my\s*(\S+)\s*=\s*\S+\s*<\s*(\d+)\s*\?\s*(\S+)\s*\.\s*(\S+)\s*\: 
> \s*(\S+)(.*)/) {
> 	my $n = $1;
> 	my $m = $2;
> 	my $a = $3;
> 	my $b = $4;
> 	println("    String $n = $b < $m ? \"$a\" + $b : \"\"+$b;");
>     }
>
>     #		my $start = $cst[$j+0];
>     elsif (m/my \$(.*)/) {
> 	my $rest = $1;
> 	println(($rest =~ /=\s*0/ ? "int" : "String") . " $rest");
>     }
>
>     #    my @cst = @{ $constraints{$day} };
>     elsif (m/my \@(\w+) = \@{ \$(\w+){\$(\w+)/) {
> 	my $a = $1;
> 	my $b = $2;
> 	my $c = $3;
> 	#      String[] cst = (String[])constraints.get(day);
> 	println("   String[] $a = (String[])$b.get($c);");
>     }
>
>     # );
> 			      elsif (m/\);/) {
> 				  # nothing
> 			      }
>
>     else {
> 	println($_);
>     }
> }
>
> println("  }");
> println("}");
>
> sub println ($) {
>     my $s = shift;
>     if (m/\%/) {return}
>     $s =~ s/\$//g;
>     $s =~ s/ \. / + /g;
>     $s =~ s/ eq\s*(\w+)/.equals\($1\)/;
>     print "$s\n";
> }
>
> =======================================================================
>
> #!/usr/bin/perl
>
> @days = (mon, tue, wed, thu, fri);
>
> # day -> constraints
> # a constraints is a list of (start,stop) times
> %constraints = (
> #        mitch           will
>  mon => ['1200','1330' , '1330','1445' , ],
> #        carl, et al.    will             sam            jeff
>  tue => ['1145','1705' , '1600','2345' ,  '1100','0515',  
> '0800','1130'],
> #        pl              will
>  wed => ['1145','1330' , '1145','1445' , ],
> #        mitch           mitch           mitch           will will      
>        sam
>  thu => ['0900','1100' , '1200','1330' , '1330','1445' ,  
> '1445','1800', '1800','2100' , '1230','1330'],
> #        mitch           will            sam
>  fri => ['0800','2145' , '0800','2145' , '1300','1500'],
>  );
>
> $start_hour = 8;
> $stop_hour = 21;
> print "Day ";
> for (my $h = $start_hour; $h <= $stop_hour; $h++) {
>     my $hour = $h < 10 ? 0 . $h : $h;
>     print $hour . "00 ";
> }
> print "\n";
> for (my $i = 0; $i <= $#days; $i++) {
>     my $stack = 0;
>     my $day = $days[$i];
>     my @cst = @{ $constraints{$day} };
>     print $day;
>     for (my $h = $start_hour; $h <= $stop_hour; $h++) {
> 	my $hour = $h < 10 ? 0 . $h : $h;
> 	print " ";
> 	for (my $m = 0; $m <= 45; $m += 15) {
> 	    for (my $j = 0; $j <= $#cst; $j += 2) {
> 		my $start = $cst[$j+0];
> 		my $stop  = $cst[$j+1];
> 		my $min = $m < 10 ? 0 . $m : $m;
> 		my $time = $hour . $min;
> 		if ($time eq $start) {$stack++;}
> 		if ($time eq $stop)  {$stack--;}
> 	    }
> 	    print $stack == 0 ? " " : $stack;
> 	}
>     }
>     print "\n";
> }
>
>
> -- 
> Jeffrey Palm --> http://www.ccs.neu.edu/home/jpalm




More information about the PRL mailing list