[PD-dev] may have figured out scope

Hans-Christoph Steiner hans at at.or.at
Mon Nov 19 20:35:40 CET 2012

It seems that the way to handle this would be to replace $0 more directly:

1) keep symbols global by default
2) add technique for marking symbols as local, like [local foo]

By removing $0 you remove the part that makes it obvious that a given symbol is local.  That seems like a bad tradeoff to me.


On Nov 16, 2012, at 1:21 AM, Jonathan Wilkes wrote:

> Ok, I may have figured out a trick to get some scoping capability
> for "pd bound" symbol names, similar to the design Tim Blechmann
> described in his Nova pdf[1] (but probably a much hackier implementation).
> 1) Make [declare] not complain when its initial args don't have a flag in front
> of them, like [declare foo bar].  Also add a -global flag, (I'll explain later).
> 2) Possibly add a t_namelist to canvas's struct called "vars" or something
> (though there might be other ways to do this) that collects these initial args
> of [declare]
> 3) Add a convenience function called scope_symbol that takes a t_pd and
> a t_symbol "s", and does the following: a) compare "s" to the symbols in
> the vars namelist of the canvas that contains the object, b) if it's a match
> then prepend the canvas name ".xblah" to "s" and return it, and c) if it
> doesn't match go to the parent and repeat until you get to toplevel.
> Now, at leisure revise code of objects that use pd_bind by putting scope_symbol
> immediately beforehand.  For [receive], this is a single change.  For [send]
> it's a bit trickier (I think you'd have to make the right inlet a proxy inlet in
> order to get it to work best).
> Anyway, once those two (or any other) objects are revised in this way, they
> are backwards compatible with the way Pd currently makes everything
> global, but the new behavior can be utilized simply by typing the symbol as
> an initial argument to [declare] on the desired canvas.  When mixing
> the old global behavior and the new, problems are unlikely to arise since the
> most common way of sharing patches is as abstractions, and generally the
> use of an abstraction doesn't require global variable interaction with the parent
> patch.  In the rare case where conflicts do arise (and truly global variable needs
> are rare IMO), [declare -global foo] would revive the old behavior regardless of
> what's declared on the parents (i.e., an explicit declaration of global regardless of
> the declarations on the parent).
> This is the best compromise I can think of to a) obsolete $0, b) provide an easy
> way for nested abstractions to communicate, and c) not break patches.
> -Jonathan
> [1] http://tim.klingt.org/publications/tim_blechmann_nova.pdf
> _______________________________________________
> Pd-dev mailing list
> Pd-dev at iem.at
> http://lists.puredata.info/listinfo/pd-dev

More information about the Pd-dev mailing list