2011-06-22 10 views
6

Estaba mirando el tonto/lindo/brillante "sleep sort" that seems to have originated over at 4chan. Para ordenar una matriz de enteros, la idea es más o menospregunta del operador Perl6

  
    foreach elt in @array 
     spawn thread(elt) 

donde rosca (n) hace

 
    sleep n 
    print n 

por lo que los valores más pequeños se imprimen antes.

Hay una aplicación Perl6

 
@foo = @foo>>.&sleep; 

consigo que >> 'hiper' el operador, y que esto supone hypering se paralelizar automáticamente. Pero el .& me confunde.

¿Alguien puede explicar esto?

gracias

Respuesta

8

Si usted tiene una función yourfunc, a continuación, se puede agarrar una referencia a ella con el signo, &yourfunc. La sintaxis $obj.$function solo invoca $function con un argumento, $obj. Así que uno podría escribir $function($obj) - excepto que esta sintaxis no permite el uso de un hiper.

Pero quien se le ocurrió esta "aplicación" estaba equivocado en tres cuentas:

  • El operador hiper permite al compilador generar un número de hilos de ejecución de cada método, que no tiene que generar una hilo para todos ellos a la vez, por lo que el "orden aleatorio" no puede funcionar
  • El hiperoperador puede aleatorizar el orden de ejecución de los métodos, pero tiene que conservar el orden o los elementos devueltos, por lo que @foo no ser ordenado en absoluto, incluso si el primer punto no se aplica.
  • sleep() se supone que devuelve el número de segundos dormidos, no el argumento. Si alguien configura la computadora para que duerma durante el cálculo, el resultado podría ser un número mucho más alto.
+0

Gracias por la respuesta, moritz. Dos seguimientos: Primero, ¿necesita la & para obtener una referencia (creo que en C el nombre de una función siempre devuelve una referencia/puntero incluso sin un &). Y yo pensé '.' era "método de invocación", es decir, árbol de herencia de búsqueda para el método de clase apropiado. ¿El uso que describes es una versión degenerada/predeterminada del 'método de invocación', o algo completamente diferente? – jonathan

+0

Bueno, Perl 6 no es C. Si menciona una subrutina sin el ampersand, la llama. – moritz

+0

Respondiendo a su segunda pregunta: '$ obj.method' es de hecho una llamada a método, pero' $ obj. $ Coderef' no lo es. – moritz