It can be inconvenient that !con will only let you concatenate dag
nodes if their operators match, because sometimes you need to combine
a dag fragment you've already got (e.g. passed in as a template
argument) with an operator you're making up on the spot (e.g. by
instantiating some other templated class, or constructing a string and
casting it to a record).
This patch introduces !conp, which works just like !con except
that it uses the operator from its first argument, and doesn't care
what the operators of subsequent arguments are.
!conp provides an alternative approach to programmatic dag node
construction, without the limitation of !dag that all the arguments
have to be of the same type: now you can give your sublists of dag
arguments in dag form, so they can take any types valid in a dag at
all, even if they're all different.
Another simple use of !conp is to replace just the operator of an
existing dag: !conp((foo), (bar x, y, z)) returns (foo x, y, z).