1. Perl / Говнокод #13647

    −159

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    package Bool;
    
    use strict;
    use Carp qw/croak/;
    use Scalar::Util qw/blessed/;
    
    use base "Exporter";
    our @EXPORT = qw/true false/;
    
    use overload(
       'bool' => \&op_bool,
       '!'    => \&op_not,
       '=='   => \&op_equal,
       '!='   => \&op_not_equal,
       '""'   => \&op_to_string,
    );
    
    our $true  = !0;
    our $false = !!0;
    
    use constant true  => bless \$true;
    use constant false => bless \$false;
    
    sub import {
       my($package) = @_;
       $package->export_to_level(1, @_);
        
       &Internals::SvREADONLY(\!0,  0);
       &Internals::SvREADONLY(\!!0, 0);
       ${ \!0 }  = true;
       ${ \!!0 } = false;
       &Internals::SvREADONLY(\!0,  1);
       &Internals::SvREADONLY(\!!0, 1);
    }
    
    sub op_bool {
       my($self) = @_;
       return $$self;
    }
    
    sub op_not {
       my($self) = @_;
       $$self ? false : true;
    }
    
    sub op_equal {
       my($l, $r) = @_;
       typecheck($l, $r);
       return (($$l && $$r || !$$l && !$$r) ? true : false);
    }
    
    sub op_not_equal {
       my($l, $r) = @_;
       typecheck($l, $r);
       return (($$l && $$r || !$$l && !$$r) ? false : true);
    }
    
    sub op_to_string {
       my($self) = @_;
       return $self ? "true" : "false";
    }
    
    sub typecheck {
       map { blessed $_ eq __PACKAGE__ or croak "Bool: Type error" } @_;
       return;
    }
    
    1;

    true/false в perl.
    true == true -> true
    1 == 1 -> true
    "a" eq "b" -> false
    и т.п.
    true == 1 # Ошибка
    Пришлось долго искать как превратить !0 в true и !!0 в false, посмотрел в чужом модуле.

    Запостил: an0nym, 22 Августа 2013

    Комментарии (16) RSS

    Добавить комментарий