2011-06-22 12 views
6

Patrzyłem na głupi/uroczy/genialny "sleep sort" that seems to have originated over at 4chan. Aby rozwiązać szereg int idea jest w przybliżeniuPytanie operatora Perl6

  
    foreach elt in @array 
     spawn thread(elt) 

którym gwint (n) ma

 
    sleep n 
    print n 

więc mniejsze wartości wydrukowany wcześniej.

Jest implementacji Perl6

 
@foo = @foo>>.&sleep; 

otrzymuję że >> 'hypers' operator, a to zakłada hypering jest automatycznie parallelized. Ale .& wprowadza mnie w błąd.

Czy ktoś może to wyjaśnić?

dzięki

Odpowiedz

8

Jeśli masz funkcję yourfunc, a następnie można pobrać referencję do niego z ampersand, &yourfunc. Składnia $obj.$function po prostu wywołuje $function z jednym argumentem, $obj. Tak więc można równie dobrze napisać $function($obj) - z tą różnicą, że ta składnia nie pozwala na użycie hyper.

Ale kto wymyślił ten „realizacji” myliłem się na trzech kontach:

  • Operator hiper kompilator pozwala na tarło liczbę wątków na wykonanie każdej metody, to nie musi tarło wątek dla wszystkich naraz - więc "sortowanie losowe" nie może działać
  • Operator hiper może losować kolejność wykonywania metod, ale musi zachować zamówienie lub zwrócone pozycje - tak, aby @foo nie być posortowane w ogóle, nawet jeśli pierwszy punkt nie ma zastosowania.
  • sleep() ma zwrócić liczbę sekund snu, a nie argument. Jeśli ktoś skonfiguruje komputer do uśpienia podczas obliczania, wynik może być znacznie wyższy.
+0

Dzięki za odpowiedź, moritz. Dwie obserwacje: Po pierwsze, potrzebujesz & do pobrania referencji (myślę, że w C nazwa funkcji zawsze zwraca referencję/wskaźnik nawet bez znaku &). I ja myślałem '.' była "metoda wywołania", tzn. drzewo dziedziczenia wyszukiwania dla odpowiedniej metody klasy. Czy opisujesz jakąś zdegenerowaną/domyślną wersję "metody invoke" lub coś zupełnie innego? – jonathan

+0

Cóż, Perl 6 to nie C. Jeśli wspominasz podprogram bez ampersandu, nazywasz go. – moritz

+0

Odpowiedzi na twoje drugie pytanie: '$ obj.method'jest rzeczywiście wywołaniem metody, ale' $ obj. $ Coderef' nie jest. – moritz