perl6.suОсвоим perl6 к 2015 году!

числа


       Интересно удостовериться как обрабатываются несколько минусов-плюсов подряд.
    
#!/usr/bin/perl6
my $num=4 + -5;
$num.say;
-1

       Sic... А если так:
    
#!/usr/bin/perl6
# my $num=4 + --5; # приводит к ошибке. компиллятор считает
# что надо сделать декремент пятерке, а она read only
my $num=4 + -(-5);
$num.say;
9

       Хм. А без пробелов?
    
#!/usr/bin/perl6
my $num=4+-5;
$num.say;
$num=4+-(-5);
$num.say;
-1
9

       Без неожиданностей. А если немного позапутывать код?
    
#!/usr/bin/perl6
my ($a,$b)=40,55;
# my $c=$a+++++$b; # error, "Cannot modify readonly value"
my $c=$a++ + ++$b;
"$a $b $c".say;
41 56 96

       96 это 40 + 56, это понятно. Жаль, что нельзя поставить пять плюсов. Было бы красиво...
       Ну и напоследок проверим:
    
#!/usr/bin/perl6
my $a=100;
my $b=$a+++-5;
"$a $b".say;
101 95

       N.B. Не надо жадничать пробелы.
# mutatio postrema: 22 Jan 2011


       Сколько будет знаков, если разделить 1 на 3?
    
#!/usr/bin/perl6
say 1/3;
0.333333

       После точки - 15. А если до точки будет больше знаков?
    
#!/usr/bin/perl6
say 31/3;
say 3001/3;
say 312345664518240952/3;
10.333333
1000.333333
104115221506080317.333333

       Понятно.
# mutatio postrema: 24 Oct 2011


       # Написанное в этой ноте перестало быть верным: делить на ноль стало нельзя
       Сколько будет знаков, если разделить 1 на 0?
       # #!/usr/bin/perl6
       # (1/0).say;
       Вот это на самом деле круто. В каком-то смысле математика - это наука о бесконечном, а оперировать этой бесконечностью раньше было непонятно как. Теперь Inf вроде бы - полноправное число, наравне с 0, 5.3 или даже 17.
    
#!/usr/bin/perl6
my $num=Inf;
$num.say;
say $num-10;
say $num+20;
say $num+$num;
$num.sin.say;
if $num > 100500 { 'major'.say }
Inf
Inf
Inf
Inf
NaN
major

       Очевидно, имеется минус бесконечность.
    
#!/usr/bin/perl6
my $num=-Inf;
$num.say;
say $num-10;
say $num+20;
say $num+$num;
$num.sin.say;
if $num < -100500 { 'minor'.say }
-Inf
-Inf
-Inf
-Inf
NaN
minor

       Ну и самое интересное - действия с несколькими бесконечностями.
    
#!/usr/bin/perl6
say Inf+(-Inf);
say Inf/Inf;
say Inf*Inf;
say Inf+Inf+(-Inf);
say 0/Inf;
say 2**Inf;
NaN
NaN
Inf
NaN
0
Inf

       Возможно, с помощью каких-нибудь прагм можно вернуть стандартное "Illegal division by zero", но очевидно же, что использование бесконечности может сделать процесс программирования еще гибче и интереснее.
       # #!/usr/bin/perl6
       # my $x; my $y=10;
       # while -1 < $x < Inf {
       # $y--;
       # $x=1/$y;
       # $x.say;
       # }
       Если нас пугает возможность получения бесконечного значения, то можно устроить обычную проверку, используя Inf как число. Предположим, что на нашей латифундии зарплата рабов зависит от выброса двух игральных костей...
       # #!/usr/bin/perl6
       # # "IC. Tabulator" - все права защищены.
       # my $i;
       # loop { $i++;
       # my $alea_unus=6.rand.ceiling;
       # my $alea_duo=6.rand.ceiling;
       # my $denarii=(3600/($alea_unus-$alea_duo)).floor;
       # "$alea_unus $alea_duo Servus $i meruit $denarii denarios".say;
       # last if $denarii == Inf;
       # }
       # say "Servus {$i+1} et ceteri denarios non ceperit\n";
       Аналогично можно писать что-то вроде: if $denarii == NaN (то есть если зарплата носит не количественный, а качественный характер).
# mutatio postrema: 10 Oct 2012

   числа, инкремент-декремент, if      charta situs       nota XLVII, nota XC, nota XCI   

    RSS     stdin@perl6.su    © Alexius Karmanov, 2010-2011