JuliaCon 2020: display, show and print – how Julia's display system works

This is one of my presentations from JuliaCon 2020. The slides are available here, and a recording of the talk is available here.


When Julia finishes a computation and obtains a value the user is presented with the result. In the Julia REPL the result is usually represented as plain text. In other environments, such as in a Jupyter notebook, you sometimes see more rich representations, for example some values display as HTML, and others as images.

The main functions responsible for output in Julia are display and show. Usually display is the first method to be called when an object is presented to the user. The display function is implemented by displays such as the Julia REPL, the IDE or the notebook interface. Next, display requests output from show with a specific so-called MIME-type. Which MIME-types that are requested depends on what output the display is able to present back to the user. For example, the REPL mostly works with the text/plain MIME-type, and the notebook display supports multiple additional MIME-types, for example image/png for image output, text/html for HTML output, and so on. Given this rough overview the display system might seem rather simple, but there are many hidden complexities.

In order to take advantage of the rich display system and implement "pretty printing" for a custom type it is generally enough to implement methods of show with specific MIME-types. All types get a default text representation, but this can easily be overridden by implementing show with the text/plain MIME type. If the type can be represented in richer formats it is simple to add additional methods. For example, in order to support image output in a notebook it is enough to implement show with the image/png MIME type.

This talk will present how Julia's display system works and go through the process of taking an output object and generating output to present the user with. The talk will also examplify this process by discussing how to customize the output for your own types.