Как строится окончательное возвращаемое значение ...
Когда [Msg | important()]
возвращается в первый раз, определяется форма окончательного возвращаемого значения. Единственная проблема заключается в том, что мы еще не знаем всех деталей окончательного возвращаемого значения. Таким образом, important()
в [Msg | important()]
будет продолжать оцениваться. Ниже приводится иллюстрация того, как строится окончательное возвращаемое значение [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
Как работает код ...
В функции important/0
, after 0
просто означает «Я не жду сообщения» - если в моем почтовом ящике есть какое-либо сообщение, я его посмотрю; если их нет, я буду продолжать (выполнить normal()
), а не ждать. В почтовом ящике уже находятся {15, high}, {7, low}, {1, low}, {17, high}. В Erlang сообщения в почтовом ящике Не помещаются в очередь в порядке очереди. Предложение receive
может быть разборчивым. Он просматривает все сообщения в почтовом ящике и «выбирает» те, которые ему нужны. В нашем случае {15, high} и {17, high} выбираются первыми согласно {Priority, Msg} when Priority > 10
. После этого берет на себя функция normal/0
. И {7, low}, {1, low} обрабатываются (согласовываются) по порядку. Наконец-то мы получили [high,high,low,low]
.
Измененная версия, раскрывающая порядок обработки ...
Мы можем немного изменить код, чтобы сделать порядок обработки (потребления) более явным:
-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.
Запускаем в оболочке:
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}]
person
Ning
schedule
11.06.2012
L1
иL2
, и объединяете их:L1 ++ L2
. Согласование - это когда у вас есть элементE
и списокL
, а затем формируется расширенный список[E | L]
. - person I GIVE CRAP ANSWERS   schedule 11.06.2012