# Is Erlang's \`receive\` more powerful/expressive than \`thread\_get\_message\`?

**URL:** <https://swi-prolog.discourse.group/t/is-erlangs-receive-more-powerful-expressive-than-thread-get-message/1519>\
**Category:** Help!\
**Tags:** erlang\
**Created:** [November 18, 2019, 2:52pm UTC](https://swi-prolog.discourse.group/t/is-erlangs-receive-more-powerful-expressive-than-thread-get-message/1519 "2019-11-18T14:52:28Z")\
**Posts on this page:** 1\
**Showing post:** 3

<div class="post-metadata">

**Author:** ![joeblog](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/joeblog/32/122_2.png) [@joeblog](https://swi-prolog.discourse.group/u/joeblog)\
**Post date:** [November 18, 2019, 3:38pm UTC](https://swi-prolog.discourse.group/t/is-erlangs-receive-more-powerful-expressive-than-thread-get-message/1519/3 "2019-11-18T15:38:44Z")

</div>

Speaking as a complete Erlang novice and an “intermediate” SWI Prologer, I’ve been mulling the pros and cons.

I’ve gradually been chopping back the examples I gave in [Erlang "ping pong" concurrent programming example translated into SWI Prolog](https://swi-prolog.discourse.group/t/erlang-ping-pong-concurrent-programming-example-translated-into-swi-prolog/1510/9) as I realised I didn’t need [**thread\_self** (-Pid)](https://www.swi-prolog.org/pldoc/doc_for?object=thread_self/1) and [**thread\_get\_message** (+Pid, ?Term)](https://www.swi-prolog.org/pldoc/man?predicate=thread_get_message/2) since both can be combined into [**thread\_get\_message** (?Term)](https://www.swi-prolog.org/pldoc/doc_for?object=thread_get_message/1) if I’m getting messages from the thread I’m in’s queue.

I like Erlang’s

```prolog
receive
   pattern1 ->
       actions1;
   pattern2 ->
       actions2;
   ....
   patternN ->
       actionsN
end.

```

In Prolog, I can sometimes achieve the above with something like:

```prolog
message_handler(pattern1, Result1) :-
    action1(pattern1, Result1), !.
message_handler(pattern2, Result2) :-
    action2(pattern2, Result2), !.
...
message_handler(patternN, ResultN) :-
    actionN(patternN, ResultN), !.
message_handler(_, false).
 
listener :-
    thread_get_message(Pattern),
    message_handler(Pattern, Result),
   ( Result
   -> listener
   ; % send finish or whatever to end
   ).

```

But I often find myself writing ugly

```prolog
 ( case == pattern1 
-> action1
; ( case == pattern2
    -> action2
     ; ...
     )
)

```

So some tips on how to do case statements nicely in Prolog would be welcome.

---

_[View the full topic](https://swi-prolog.discourse.group/t/is-erlangs-receive-more-powerful-expressive-than-thread-get-message/1519)._
