2008-09-19 2 views
14

Больше информации от the Perl 6 Wikipedia entryЧто вы можете использовать для переходов Perl 6?

Junctions

Perl 6 вводит понятие переходов:. Значений, которые являются композиты из других значений [24] В ранние дни дизайна Perl 6 они назывались «суперпозициями», по аналогии с понятием в квантовой физике квантовых суперпозиций - формы волны, которые могут одновременно занимать несколько состояний, пока наблюдение «не разрушит» их. Модуль Perl 5, выпущенный в 2000 году Дамианом Конвей под названием Quantum :: Superpositions [25], предоставил первоначальное доказательство концепции. Хотя сначала такие суперпозиционные ценности казались просто программным любопытством, со временем их полезность и интуитивность стали широко узнаваемыми, а соединения теперь занимают центральное место в дизайне Perl 6.

В своей простейшей форме, перекрестки создаются путем объединения множества значений с junctive операторами:

my $any_even_digit = 0|2|4|6|8; # any(0, 2, 4, 6, 8) 
my $all_odd_digits = 1&3&5&7&9; # all(1, 3, 5, 7, 9) 

| указывает значение, равное либо его левым, либо правым аргументам. & указывает значение, равное его левым и правым аргументам. Эти значения могут использоваться в любом коде, который будет использовать нормальное значение. Операции, выполняемые на стыке, действуют на всех членов соединения одинаково и объединяются в соответствии с юнктирующим оператором. Итак, («яблоко» | «банан») ~ «s» даст «яблоки» | «бананы». В сравнении, переходы возвращают единственный истинный или ложный результат для сравнения. «любые» соединения возвращаются true, если сравнение верно для любого из элементов соединения. «все» соединения возвращаются true, если сравнение верно для всех элементов соединения.

Junctions также может быть использован для более богато дополнить систему типов, вводя стиль обобщенного программирования, ограничиваемый в стыки типов:

sub get_tint (RGB_Color|CMYK_Color $color, num $opacity) { ... } 
sub store_record (Record&Storable $rec) { ... } 

ответ

11

Сколько дней в данном месяце?

given($month){ 
    when any(qw'1 3 5 7 8 10 12') { 
    $day = 31 
    } 
    when any(qw'4 6 9 11') { 
    $day = 30 
    } 
    when 2 { 
    $day = 29 
    } 
} 
+0

Я мог бы также использовать `one()` вместо `any()`, но `any()`, вероятно, будет быстрее. – 2008-09-24 03:51:44

+0

На самом деле для февральского случая, может быть, я должен был вернуть один (28,29); – 2008-12-11 05:16:29

6

Наиболее привлекательной особенностью переходов является то, что вам не нужно писать много кода тест для сложных ситуаций. Вы описываете ситуацию со стыками, затем применяете тест. Вы не думаете о том, как вы получаете ответ (например, используя операторы короткого замыкания или блоки), но какой вопрос вы задаете.

5

Автотестирование звучит круто, хотя я не знаю, каков его текущий статус.

for all(@files) -> $file { 
    do_something($file); 
} 

Развязки не имеют порядка, поэтому виртуальная машина может свободно порождать поток для каждого элемента в @files и обрабатывать их все параллельно.