[PD] here I go again..dynamic abstractions

Mathieu Bouchard matju at artengine.ca
Tue Feb 10 17:37:38 CET 2009

On Sat, 7 Feb 2009, Claude Heiland-Allen wrote:

> I don't know why, but it makes parsing Pd patches 1000x less 
> straightforward than required (you need a two-phase parser that has a 
> special exception to detect message boxes and not expand dollars, 
> allowing the message box objects to parse them itself later, while 
> expanding dollars for everything else).

The way it works in Pd, Is that the parsing only cuts a patch into lists 
of atoms, and then the evaluation of $ is a separate phase. There are two 
levels of evaluation of $ in patches: one is because the patch is saved as 
a sequence of messages that do dynamic patching of all of the patch. 
Therefore, an objectbox containing $0 has to be saved as \$0, which gets 
converted to $0 on the first evaluation, and the $0 turns into a float on 
the second evaluation.

I don't think that this way of doing things is really bad, except perhaps 
that it allows one to make patches that do weird things that don't get 
saved back the same way (e.g. what if you edit a .pd file to put 
non-backslashed dollars in it?)

That #X obj has this extra evaluation level compared to #X msg and others, 
is not necessarily bad nor uncommon. The LISP languages generally have 
that: there are a number of so-called special-forms in which arguments are 
not evaluated, and some others in which only some arguments are evaluated. 
This is how 'foo is a shortcut for (quote foo) in which the argument of 
quote is not evaluated. In theory, you only really need that one 
special-form in such a language, but the inventors of this figured out 
that it was annoying to have to have only one special-form because it 
needs too many apostrophes all over the place. In the end, though, 
inventors of various LISP dialects could not agree on how many 
special-forms there should be. (Macros allow the user to define its own 
things that look like special-forms, but because of their evaluation 
order, it also allows bypassing any non-evaluation too)

In Tcl, which is a distant cousin of LISP, things are different. Instead, 
there is an extra level of syntax because all lists are assumed to be 
quoted, a first parsing handles only { } \{ \} and a second parsing 
handles $ \$ [ ] \[ \] ... not counting the [expr] calls, which are a 
third level of parsing and happens quite often because it's explicit in 
[if] [while] etc. The avoidance of having some kind of evaluation at the 
first level of parsing makes it necessary to have the second level. My 
point is that it's a tradeoff in the design of languages. If you remove 
complexity in one way, it reappears in another way if the complexity is 

So, what could have Pd done differently? Perhaps two things:

1. Avoid the substitution in the first evaluation, so that most 
backslashes aren't needed in the file format.

2. Use a different character for substitution in messageboxes, so that 
message arguments are substituted using # or whatever (that's a second 
level of parsing because # is not recognised at the first parsing level; 
or would it??). But this makes people want to use $ to access 
abstraction-args directly in it, and if that feature is considered as a 
good thing, then you still need to either skip substitution in #X msg by 
opposition to #X obj, or add another level of backslashes in msg.

(But that's all very hypothetical and nothing of that will change in pd)

> I ran into this problem implementing PotatoData (basically a proof of 
> concept, it's a Pd patch interpreter written in Lua with minimal amounts 
> of C for DSP, can run some trivial audio patches) a couple of months 
> ago, and just ducked it completely - message boxes in my implementation 
> don't support dollars at all (nor commas or semicolons for sequencing 
> and redirection, but that's a separate issue). I wish message boxes had 
> used a different special character, it would have made life much much 
> easier.

I don't think it's a big deal. There are much more difficult things than 
that, that you have to do to make a good interpreter and/or compiler. It's 
just a bit confusing and somewhat easy to get wrong if you don't put all 
of your attention in it, but if pd were different, this set of problems 
would be replaced by another set of problems.

> It's a mess.  There are two similar concepts at work:
> 1. replacing dollars with arguments at patch execution time
> 2. replacing dollars with arguments at message passing time

There are three of them.
   0. replacing dollars when loading patch (not normally used)
   1. replacing dollars when loading #X obj
   2. replacing dollars when message is sent to a #X msg box

> The confusion arises partly because when Pd loads a patch, it's really
> internally passing messages around.

That's why level 0 is there. It's never used by normal patches, yet it 
makes it necessary to add extra backslashes everywhere.

Perhaps all this Pd parsing process is more difficult because it is not so 
well documented (or the documentation has been forgotten in some dungeon 
and is not part of any manual). Therefore you have to discover more of it 
yourself and may have surprises and there are not many people paying 
attention to the topic and not much standard terminology to talk about how 
it is done in Pd. It doesn't *have* to be simplified, it has to be seen as 
simpler. But in any case, things become seen as simpler once they are 

> $ in message boxes is unfortunate. If there was a different symbol,
> perhaps #, you could combine both phases in one object box to avoid
> jumping through pointless hoops.

exactly. well, it's very well possible to just avoid using messageboxes 
and instead use an external that would do the same job. It's not so hard.

> [$0-#1-$2-#3( would be nice, but as Pd is now, it's a nightmare.

What about [m $0-#1-$2-#3] ? if such an external existed... the only funky 
thing in there is if $2 substitutes to something with a "#" in it... in 
that case, the extra level of evaluation would become apparent.

  _ _ __ ___ _____ ________ _____________ _____________________ ...
| Mathieu Bouchard - tél:+1.514.383.3801, Montréal, Québec

More information about the Pd-list mailing list