#!/usr/bin/env -S perl ##!/usr/bin/env -S perl -wd use warnings; use strict; use feature ":all"; use Tkx; use Tk; sub factorial { my ($n) = @_; return 1 if $n == 0; return factorial($n-1) * $n; } sub recurWrapper { my $n = factorial(@_); say "after recursion: ", $n; return $n; } sub factorial_1 { (my $val) = @_; my $result = 1; while ( $val > 0 ) { $result *= $val; $val--; } say "\$result inside factorial_1: $result"; return $result; } sub intOverflow { (my $val) = @_; return $val *= 1; } sub exponential { (my $val) = @_; my $n = 2**$val; say "\$result inside exponential $n"; return $n; } say 'factorial(17): ', factorial(17); say 'factorial_1(17): ', factorial_1(17); say ''; say 'exponential(31): ', exponential(31); say 'exponential(32): ', exponential(32); say 'exponential(33): ', exponential(33); say ''; say 'intOverflow(2147483647): ', intOverflow(2147483647); say 'intOverflow(2147483648): ', intOverflow(2147483648); say 'intOverflow(2147483649): ', intOverflow(2147483649); my $mw = Tkx::widget->new("."); $mw->g_wm_title("Factorial Calculator"); $mw->g_wm_minsize(200, 150); my $result; my $value; my $v = $mw->new_entry( -width => 6, -relief => "sunken", -textvariable => \$value, ); #$v->Tkx::bind('', sub { say $value; $result = factorial($value); say $result; } ); $v->Tkx::bind('', sub { say $value; $result = recurWrapper($value); say $result; } ); #$v->Tkx::bind('', sub { say $value; $result = factorial_1($value); say $result; } ); #$v->Tkx::bind('', sub { say $value; $result = exponential($value); say $result; } ); #$v->Tkx::bind('', sub { say $value; $result = intOverFlow($value); say $result; } ); my $desc = $mw->new_label( -text => "Factorial is:", ); my $r = $mw->new_label( -textvariable => \$result, ); my $calc = $mw->new_button( -text => "Calculate", # -command => sub { say $value; $result = factorial($value); say $result; }, -command => sub { say $value; $result = recurWrapper($value); say $result; }, # -command => sub { say $value; $result = factorial_1($value); say $result; }, # -command => sub { say $value; $result = exponential($value); say $result; }, # -command => sub { say $value; $result = intOverflow($value); say $result; }, ); my $q = $mw->new_button( -text => "QUIT", -command => sub { $mw->g_destroy; }, ); Tkx::grid($v, $desc, $r, -padx => 10, -pady => 10); Tkx::grid($calc, "-", "-", -padx => 10, -pady => 5); Tkx::grid($q, "-", "-", -padx => 10, -pady => 5); Tkx::MainLoop() __END__