On Apr 26, 2010, at 12:59 PM, Claude Heiland-Allen wrote:
Mathieu Bouchard wrote:
On Mon, 26 Apr 2010, Claude Heiland-Allen wrote:
One way of fixing this once and for all would be to have a
separate [objectmaker] for each canvas (including abstractions,
but not subpatches, ie, those canvases that have a
t_canvasenvironment attached to them - at least that is how I
understand that part of Pd's code).Thanks for bringing back the topic. There was a thread about that
on pd-dev in september 2006, e.g. : http://lists.puredata.info/pipermail/pd-dev/2006-09/007591.html http://lists.puredata.info/pipermail/pd-dev/2006-09/007605.html http://lists.puredata.info/pipermail/pd-dev/2006-09/007607.html http://lists.puredata.info/pipermail/pd-dev/2006-09/007608.html http://lists.puredata.info/pipermail/pd-dev/2006-09/007609.html etcThanks for the references.
I have a vague sketch of an implementation like this already, but
it's quite brutal to the core of Pd so I doubt the changes would
be accepted by anyone without me cleaning it up a lot and
providing a clean .diff to a current development version of Pd...cleanliness is in the eye of the beholder... if you spend a lot of
time cleaning, you can realise that it doesn't look any cleaner to
the people you want to please, or else it can look dirtier.True...
apart from that, I think that you deserve good luck with this
project and I am happy to learn that you succeeded.Still got abstraction support to re-enable, hopefully it will work
as planned - then I can claim success :-) Thanks :-)but how does «t_pd *pd_newest» work in that context ?
newest is set when typedmess() sees that (target ==
pd_objectmaker). So the default pd_objectmaker defers to the canvas- local objectmaker, which sets pd_objectmaker to itself (before
retrying after any ondemand load) or a child (for imported
libraries) objectmaker before calling typedmess() and inspecting
newest. So it's just another layer of baroque hackery, with special
behaviour needed in [bang] [float] [symbol] and probably a couple of
otherssome names changed for no good reason other than to see what would
break in the rest of Pd:----8<---- /* called when no more-specific method is found, happily this happens at the top level canvas-local factory, so we can switch the default td_legacy_objectmaker before too much damage is done... */ static void td_objectfactory_anything(td_objectfactory *of, t_symbol
*s, int argc, t_atom *argv) { newest = 0; td_list *n; td_ondemand *od = td_map_lookup(of->ondemand, s); if (od) { /* push object factory */ td_objectfactory *old = td_legacy_objectmaker; td_legacy_objectmaker = of; /* load on demand */ td_map_delete(of->ondemand, s); td_ondemand_load(od); td_ondemand_free(od); /* retry creation */ /* typedmess tests for td_legacy_objectmaker */ typedmess(&td_legacy_objectmaker->pd, s, argc, argv); /* pop object factory */ td_legacy_objectmaker = old; if (newest) { return; } } for (n = of->children; n; n = n->next) { td_objectfactory *c = n->p; td_objectfactory *old = td_legacy_objectmaker; td_legacy_objectmaker = c; /* typedmess tests for td_legacy_objectmaker */ typedmess(&td_legacy_objectmaker->pd, s, argc, argv); td_legacy_objectmaker = old; if (newest) { return; } } } ----8<----
This is some really interesting work, I am looking forward to trying
it out. I haven't really thought much about the implementation, but I
like the idea that the canvas-local namespace is blank until loading
something. We might consider having a library that loads by default,
something like how python loads a default library.
.hc
"A cellphone to me is just an opportunity to be irritated wherever you
are." - Linus Torvalds