On Wed, Jan 21, 2004 at 07:48:21PM +0200, Gaal Yahas wrote: > 8.2 is not TRUE as Andrew defined it, but it is true under Perl's idea > of truth. That is in fact my point: using the non-native notion of what > truth is, you can't use any code from other people because you can't > assume it returns what you expect to be called true to signal truth.
Somebody had to do it. . . . #!/usr/bin/perl -w use strict; BEGIN { package True; use overload 'eq' => \&equals, '==' => \&equals, bool => sub { !!1 }, '!' => sub { False->new() }, ; use base 'Exporter'; our @EXPORT = qw( &TRUE ); sub new { my ($class) = @_; my $self = 1; return bless \$self, $class; } sub TRUE { return True->new(); } sub equals { my ($x, $y, $swap) = @_; $y ? True->new() : False->new(); } } BEGIN { package False; use overload 'eq' => \&equals, '==' => \&equals, bool => sub { !!0 }, '!' => sub { True->new() }, ; use base 'Exporter'; our @EXPORT = qw( FALSE ); sub new { my ($class) = @_; my $self = 0; return bless \$self, $class; } sub FALSE { return False->new(); } sub equals { my ($x, $y, $swap) = @_; return $y ? False->new() : True->new(); } } BEGIN { import True; import False; } my $n; BEGIN { $n = 0 } use Test; plan tests => $n; BEGIN { $n += 2 } ok TRUE; ok not FALSE; BEGIN { $n += 4 } ok not TRUE == FALSE; ok not TRUE eq FALSE; ok not FALSE == TRUE; ok not FALSE eq TRUE; BEGIN { $n += 4 } { my $a = "true"; ok $a; ok $a == TRUE; ok $a eq TRUE; ok $a, TRUE; } BEGIN { $n += 4 } { my $b = 0; ok !$b; ok $b eq FALSE; ok $b == FALSE; ok $b, FALSE; } BEGIN { $n += 1 } { my $c; if ($c) { ok $c == TRUE } else { ok $c == FALSE } } BEGIN { $n += 8 } { ok TRUE == TRUE; ok FALSE == FALSE; ok FALSE == FALSE; TRUE; ok TRUE == FALSE, FALSE; ok FALSE == TRUE, FALSE; ok((TRUE == TRUE) == TRUE); ok((FALSE == FALSE) == TRUE); ok((TRUE == FALSE) == FALSE); } BEGIN { $n += 4 } { ok 8.2 == TRUE; ok 8.2, TRUE; ok 8.2, not FALSE; ok 8.2, not not TRUE; } __END__ LP^>