When combining and pipelining blocks, a special field called
#:subblocks
is updated. This field indicates how the final block was
built.
When combining blocks, the subblocks are set as a list. For example,
(block-subblocks (combine-blocks* a b)) ;=> `(,a ,b)
Combining more blocks will append to the list.
(block-subblocks (combine-blocks* (combine-blocks* a b) c)) ;=> `(,a ,b ,c)
When running a pipeline, the subblocks of each pipeline element are inserted into a list. Elements without subblocks are inserted directly.
(block-subblocks (run-blocks* (combine-blocks* a b) c d)) ;=> `((,a ,b) ,c ,d)
A side effect of this is it is impossible to tell by looking at the
#:subblocks
field alone whether a block created by running a
pipeline or by combining blocks. A block created by running a pipeline
of blocks that were not previously combined would look identical to a
block created by combining blocks.
The elements of the #:subblocks
field are the original blocks.
When running a pipeline, the blocks are not executed directly.
Instead, the #:code
field is updated by replacing #:chain
, and
that new block is the one that executes. However, that is not
reflected in the subblocks. The subblocks #:code
field will not be
replaced.