#!/usr/bin/perl -w use strict; use re 'eval'; my $question="Div Div Con 18 Con 2 Div Con 6 Con 3"; my @ans=ev($question)->(0); print "Answer=$ans[0], Number of divisions=$ans[1]\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 Bind(ev($numer))->( sub{ my $n=$_[0]; Bind(ev($denom))->( sub{ my $d=$_[0]; Bind(tick())->( sub{ my $e=$_[0]; 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) } }