#!/usr/bin/perl -w use strict; use re 'eval'; use Do_notation; my $question="Div Div Con 18 Con 2 Div Con 6 Con 3"; my @ans=ev($question)->(0); print "ans=@ans\n"; sub ev { my $term = $_[0]; my $con = qr{Con (\d+)}; my $div; $div = qr{Div ($con|(??{$div})) ($con|(??{$div}))}; if($term =~ /^$con/) { return Return($1); } elsif($term=~/^$div/) { my $numer=$1; my $denom=$3; return DO { my $n <- ev($numer); my $d <- ev($denom); my $g <- tick(); Return( $n / $d ); } }else{die "Syntax Error: $term";} } sub Return { my $val = $_[0]; sub { my $state = $_[0]; ($val, $state) } } sub Bind { my $func1 = $_[0]; sub { my $func2 = $_[0]; sub { my $initial_state=$_[0]; (my $a, my $next_state) = $func1->($initial_state); (my $b, my $final_state)=($func2->($a))->($next_state); ($b, $final_state) } } } sub tick { sub{ (undef,$_[0]+1) } }