Color Prettyprint
Sunday, June 15, 2025
Factor has a neat feature in the prettyprint
vocabulary
that allows printing objects, typically as valid source literal expressions.
There are small caveats to that regarding circularity, depth limits, and
other prettyprint control
variables,
but it’s roughly true that you can pprint
most everything and have it be
useful.
At some point in the past few years, I noticed that Xcode and Swift Playground have support for color literals that are rendered in the source code. You can see that in this short video describing how it works:
Inspired by that – and a past effort at color tab completion – I thought it would be fun to show how you might extend our color support to allow colors to be prettyprinted with a little gadget in the UI that renders their colors.
First, we need to define a section object that holds a color and renders it using a colored border gadget.
TUPLE: color-section < section color ;
: <color-section> ( color -- color-section )
1 color-section new-section swap >>color ;
M: color-section short-section
" " <label> { 5 0 } <border>
swap color>> <solid> >>interior
COLOR: black <solid> >>boundary
output-stream get write-gadget ;
Next, we extend pprint*
with a custom implementation for any color type
as well as our named
colors
that adds a color section to the output block:
M: color pprint*
<block
[ call-next-method ]
[ <color-section> add-section ] bi
block> ;
M: parsed-color pprint*
<block
[ \ COLOR: pprint-word string>> text ]
[ <color-section> add-section ] bi
block> ;
And, now that we have that, we can push some different colors to the stack and see how they are all displayed:
Pretty cool.
I did not commit this yet – partly because I’m not sure we want this as-is and also partly because it needs to only display the gadget if the UI is running. We also might want to consider the UI theme and choose a nice contrasting color for the border element.