recoder: (Default)
[personal profile] recoder

cover
Читаю книжку "Perl 6 and Parrot Essentials" и не перестаю поражаться элегантности нового перла.

Сначала рассказано про принципы дизайна языка:

  • Principle of Simplicity - что простое решение лучше сложного
  • Huffman Coding - часто употребляемое должно занимать меньше места
  • Principle of Adaptability - если надо будет - Перл легко расширить!
  • Principle of Prominence - важные структуры должны сами бросаться в глаза
  • Principle of End Weight - простые и важные вещи должны быть в начале
  • Principle of Context - люди мыслят в контекстах, так пусть и Перл тоже использует контексты
  • Principle of DWIM - Do What I Mean, язык должен быть интуитивным (для людей с правильной интуицией)
  • Principle of Reuse - не надо плодить лишние сущности и правила, если можно использовать старые в новом контексте
  • Principle of Distinction - действительно разные вещи должны выглядеть разными
  • Principle of Freedom - свободу программисту в его самовыражении! (ну и TMTOWTDI)
  • Principle of Borrowing - хорошую фичу и из другого языка позаимствовать не грех

Ну приятно же когда умные люди заботливо пишут язык для других умных людей!

Ну в каком ещё языке бывают такие изящные конструкции:

my $pi is constant = 3.14159;

my @range = 3...; # бесконечный диапазон

my %hash is Hash of Array of Int; # при том, что это необязательно

Красивые гипер-операторы с "»" и "«", применяющие оператор поэлементно к спискам.

my @sum = @first »+« @second;
my @pay = @money »*« @rate;

Просто шикарный оператор switch given:

given $bugblatter {
    when Beast::Trall { close_eyes();     }
    when 'ravenous'   { toss( 'steak' );  }
    when .feeding     { sneak_past();     }
    when /grrr+/      { cover_ears();     }
    when 2            { run_between();    }
    when (3..10)      { run_away();       }
}

Такие вот занятные сравнения:

if( 24 < $age < 42 ) { ... }

if( $whale // $petunia ) { ... } # сравнение на OR по критерию definedness 

Мощнейшая концепция matching'a. Матчится почти всё почти ко всему:

$string ~~ "Ford" # сравнение строк

$number ~~ 42 # сравнение чисел

$string ~~ /towel/
$string ~~ s/weapon/towel/ # RegExp'ы

$name ~~ ( "Zaphod", "Ford", "Trillian" ) # поиск значения в списке
$name ~~ ( "Zaphod", 42, /petunias/ ) # или такой поиск по списку

( "Zaphod", "Ford", "Trillian" ) ~~ ( "Zaphod", "Ford", "Trillian" ) # сравнение списков

@array ~~ /illi/ # OR-match по всем элементам массива

$key ~~ %hash # проверка значения хэша по ключу

%vogons ~~ %humans # поиск пересечения по ключам хэшей

А как вам такие итераторы?

for %ages.kv -> $name, $age {
    print "$name is now $age";
}

for zip( @animals, @things, :by(2) ) -> $a1, $a2, $t1, $t2 {
    print "The animals, they came, they came in twosies, twosies: ";
    print "$a1 and $a2";
    print "Two things. And I call them, $t1 and $t2.";
}

for @useful_things -> $item {
    next when 'towel';
    redo when .try_again;
    last when 'bomb';
    print "Are you sure you need your $item?";
}

И это я ещё не дошёл до классов, свойств, особенностей (traits) и прочего богатства! Продолжаю читать...

Бородатый дядька Larry Wall - форева!

books
perl

December 2024

S M T W T F S
1234567
891011121314
15161718192021
22232425 262728
293031    

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 25th, 2025 11:09 am
Powered by Dreamwidth Studios