Perl6 оператор вопрос - PullRequest
       17

Perl6 оператор вопрос

6 голосов
/ 23 июня 2011

Я смотрел на глупую / милую / блестящую "разновидность сна", которая, кажется, возникла в 4chan . Чтобы отсортировать массив целых чисел, идея примерно равна

    
    foreach elt in @array
        spawn thread(elt)

, где thread (n) делает

    sleep n
    print n

чтобы меньшие значения печатались раньше.

Есть реализация Perl6

@foo = @foo>>.&sleep;

Я понял, что >> 'преуменьшает' оператор, и это предполагает, что гиперинг автоматически распараллеливается. Но .& смущает меня.

Может кто-нибудь объяснить это?

спасибо

1 Ответ

9 голосов
/ 23 июня 2011

Если у вас есть функция yourfunc, то вы можете получить ссылку на нее с помощью амперсанда, &yourfunc.Синтаксис $obj.$function просто вызывает $function с одним аргументом $obj.Таким образом, можно с таким же успехом написать $function($obj) - за исключением того, что этот синтаксис не позволяет использовать гипер.

Но тот, кто придумал эту «реализацию», ошибался в трех случаях:

  • Гипероператор позволяет компилятору порождать несколько потоков для выполнения каждого метода, ему не нужно порождать поток для всех них одновременно - поэтому «случайная сортировка» не может работать
  • Гипероператор может рандомизировать порядок выполнения методов, но он должен сохранять порядок или возвращаемые элементы - поэтому @foo не будет сортироваться вообще, даже если первая точка не применяется.
  • sleep () должен возвращать количество спящих секунд, а не аргумент.Если кто-то переводит компьютер в спящий режим во время вычислений, результатом может быть намного большее число.
...