Next: Subblocks, Previous: Combining Blocks, Up: Blocks [Contents]
Blocks can be run as a pipeline. The results of the parent block is
inserted into the child’s code field, using the chain string
as a marker for what to replace.
Pipelines are not limited to two elements.
run-blocks* is a wrapper around run-blocks that automatically
inserts its arguments into a list.
(define-block ruby-print-python-code
#:code "puts \"print(74, end='')\""
#:language ruby)
(define-block python-print
#:code "%ruby%"
#:chain "%ruby%" ;text to replace in #:code
#:language python)
(define-block ruby-add-1
#:code "print %python% + 1"
#:chain "%python%" ;this can be anything
#:language ruby)
(block-result (run-blocks*
ruby-print-python-code
python-print
ruby-add-1)) ;=> "75"
If the child’s code field is not set, the result field is
inserted directly into the code field.
(define-block guile-print-guile-code #:code ''(+ 1 1) ;result => '(+ 1 1) #:language guile-direct) (define-block guile-eval #:language guile-direct) (block-result (run-blocks* guile-print-guile-code guile-eval)) ;=> 2
It is possible to run a nested list of blocks without calling
combine-blocks first.
(run-blocks `((,a ,b)
,c ,d))
;; is equivalent to
(run-blocks `(,(combine-blocks* a b)
,c ,d))
Directly running nested blocks is only supported one level deep.
(run-blocks `((,a ,b (,c ,d))
,d)) ;invalid
(run-blocks `((,a ,b ,(combine-blocks* c d))
,d)) ;valid
Explicit calls to combine-blocks would be required.