Читаю книжку "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 - форева!