... [Msg | important()]
처음 반환되는
는 최종 리턴 값의 형태가 결정된다. 유일한 관심사는 최종 수익 가치의 모든 세부 사항을 아직 알지 못한다는 것입니다. 따라서 [Msg | important()]
에있는 important()
은 계속 평가됩니다. 다음은 최종 반환 값 [high,high,low,low]
이 생성되는 방법을 보여주는 그림입니다. 기능 important/0
의 코드가 작동하는 방법
[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
...
는 after 0
단순히 "메시지가 오기를 기다릴하지 않는다"를 의미 - 내 사서함에있는 모든 메시지가있는 경우, I 그것을 볼 것이다; 어떤 것이 없다면 거기에서 기다리는 대신 계속 (normal()
을 실행하십시오).사서함에는 이미 {15, 높음}, {7} 낮음, {1, 낮음}, {17, 높음}이 이미 있습니다. Erlang에서 사서함의 메시지는 이 아니며은 선착순으로 대기 중입니다. receive
절은 까다 롭습니다. 그것은 사서함의 모든 메시지를 스캔하여 원하는 메시지를 "선택"합니다. 이 경우 {Priority, Msg} when Priority > 10
에 따라 {15, high} 및 {17, high}이 먼저 선택됩니다. 그 후에, 기능 normal/0
가 인수합니다. 그리고 {7, 낮은}, {1, 낮은} 주문 처리 (consed). 마지막으로 [high,high,low,low]
이 있습니다.
처리 순서를 보여준다 수정 된 버전 ...
우리는 처리 (consing) 순서가 더 명확하게하기 위해 코드를 조금 수정할 수 있습니다
:
-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}]
consed, consed. 연결은 두 개의리스트,''L1''과''L2''가 있고 그것들을 연결합니다 :'L1 ++ L2'. Consumer는 요소 'E'와리스트 L이 있고 확장 목록'[E | L]'. –