First of all show: allows one to replace multiple components in one request. This is not possible with call: as it blocks the flow of execution and the developer has no possibility to display another component at the same time.

Another reason to use show: is that it is more lightweight and that it uses fewer resources than call:. This means that if the blocking behavior is not needed, then show: is more memory friendly.

Finally some Smalltalk dialects cannot implement call: due to limitations in their VM.

If you want or must get rid of the call: statements in a sequence of calls things are relatively simple. Transform code using call:

The transformation technique applied here is called continuation-passing style or short CPS. The onAnswer: block implements the continuation of the flow after the shown component answered. Unfortunately for more complicated flows CPS lead to messy code pretty quickly.