#implements something like "do" notation for the Identity monad. #bound variables become subs in the main namespace #add_var thunks the subs to get laziness with sharing sub add_var { my ($name, $fn) = @_; *{"main::$name"} = sub{ my $ret = $fn->(@_); *{"main::$name"}= sub{$ret}; return $ret }; return 1; } use strict; sub mdo { while (scalar @_ > 1) { my $name = shift; my $fn = shift; add_var($name,$fn); } my $fn = shift; return $fn->(); } my $f = sub { print "a: ", a(), " b: ", b(), "\n";}; mdo( a => sub{1} , b => sub{ a() + 5} , $f ); mdo( a => sub{2} , b => sub{ a() * 5} , $f );