¿Cómo se construye el valor de retorno final ...
Cuando se está volviendo [Msg | important()]
por primera vez, se determina la forma del valor de retorno final. La única preocupación es que aún no conocemos todos los detalles del valor de retorno final. Por lo tanto, el important()
en el [Msg | important()]
continuará siendo evaluado. La siguiente es una ilustración de cómo se construye el valor de retorno final [high,high,low,low]
.
[high | important( )] <---- Defines the final form
---------------------------------
[high | important( )] <---- Adds more details
------------------------
normal( ) <---- Adds more details
------------------------
[low | normal( )] <---- Adds more details
----------------
[low | normal()] <---- Adds more details
--------
[ ] <---- Adds more details
------------------------------------------
[high | [high | [low | [low | []]]]]
[high,high,low,low] <---- The final return value
¿Cómo funciona el código ...
En función important/0
, after 0
simplemente significa "No espero que los mensajes vienen" - si hay algún mensaje en mi buzón de correo, me lo mirará; si no hay ninguno, continuaré (ejecutar normal()
) en lugar de esperar allí.En el buzón, hay {15, alto}, {7, bajo}, {1, bajo}, {17, alto} sentado allí ya. En Erlang, los mensajes en el buzón son No en cola en orden de orden de llegada. La cláusula receive
puede ser delicada. Escanea todos los mensajes en el buzón y "selecciona" los que desea. En nuestro caso, {15, alto} y {17, alto} obtener recogido primero de acuerdo con {Priority, Msg} when Priority > 10
. Después de eso, toma la función normal/0
. Y {7, bajo}, {1, bajo} se procesa (compila) en orden. Finalmente, obtuvimos [high,high,low,low]
.
Una versión modificada que revela el orden de procesamiento ...
Podemos modificar el código un poco con el fin de hacer que el procesamiento (Consing) Para más explícito:
-module(prior).
-compile(export_all).
important() ->
receive
{Priority, Msg} when Priority > 10 ->
[{Priority, Msg} | important()] % <---- Edited
after 0 ->
normal()
end.
normal() ->
receive
{Priority, Msg} -> % <---- Edited
[{Priority, Msg} | normal()] % <---- Edited
after 0 ->
[]
end.
Run en el shell:
4> c(prior).
{ok, prior}
5> self() ! {15, high}, self() ! {7, low}, self() ! {1, low}, self() ! {17, high}.
{17,high}
6> prior:important().
[{15,high},{17,high},{7,low},{1,low}]
No concatenados, cons. la concatenación es cuando tienes dos listas, 'L1' y' L2' y las concatenas: 'L1 ++ L2'. Consing es cuando tiene un elemento 'E' y una lista' L' y luego forma la lista extendida '[E | L] '. –