Files
xod/docs/guide/creating-variadics/README.md
2018-03-05 12:27:04 +03:00

85 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Creating Variadic Patch Nodes
---
# Creating Variadic Patch Nodes
Declaring your patch node to be variadic allows its user to add or remove
similar input pins dynamically. For you, it is a way to avoid creating a list
of mechanical variations to support the various number of inputs like:
* `foobar`
* `foobar-2`
* `foobar-3`
*
* `foobar-8`
Make sure youre familiar with the [variadic nodes](../variadics/) concept
and understand how the expansion process works.
## Markers
To make your patch node variadic, you should place a special marker node on it.
Find the marker node under the `xod/patch-nodes` library. You need
`variadic-1`, `variadic-2`, or `variadic-3`. The number defines the arity step,
that is the group size by which the rightmost input pins replicate.
The `variadic-*` node itself does nothing and is stripped out during
compilation. It exists solely to define indefinite arity support.
## Pin assignments
Whenever you place a variadic node marker, the input pins get roles depending
on their position relative to each other. Consider a patch node draft with a
`variadic-2` marker:
![Pin assignments](./assignments.patch.png)
To make the expansion XOD split pins of a variadic patch node into three
groups.
**Variadic pins** (aka value pins). The rightmost pins get this role. Their
number equals to the arity step. In the example above they are `V1` and
`V2`. Values for the inputs on each level are provided by a node user.
**Accumulator pins**. Pins in the middle get this role. Their number equals the
output number. In the example they are `A1`, `A2`, `A3`, and `A4`. The user
provides values only for the top level of the cascade; all other levels get
accumulator values straightly from output pins of the respective upstream node.
**Shared pins**. The leftmost pins which are not variadic nor accumulator get
this role. In the example they are `S1` and `S2`. The values are provided by
the user, and they are delivered to each level in the cascade as is. In many
cases there will be no shared pins.
Finally, consider a string join node example. We want a node which takes an
arbitrary number (two or more) of input strings and joins them together
inserting a delimiter between each. For example, it joins `"foo"`, `"bar"`,
`"baz"` with delimiter `"; "` into `"foo; bar; baz"`. The delimiter is shared
between all levels of expansion, so its input terminal goes left. We want the
arity to increment one by one, so we use the `variadic-1` marker. Finally, a
possible patch node implementation may look like this:
![Join node implementation](./join.patch.png)
## Rules
To let XOD properly expand your variadic node when transpiling you must satisfy
several natural restrictions:
1. There should be no more than a single `variadic-*` marker.
2. A variadic patch node should have at least one output.
3. The total number of inputs should be equal or greater than the number of
outputs plus the arity step.
4. The types of accumulator inputs must strictly match the types of the outputs
even if an implicit cast is allowed in other cases.
On the patch board, the variadic marker nodes either render usually or in red
color. The later case tells youre breaking some rules.
![Marker error](./marker-error.png)
Hover the node to see the error. You have to resolve all issues or remove the
marker node to make the program compile successfully.