Well, what about the current-namespace? The output ports? It seems dangerous and leak introducing (possibly). <br><br>I don&#39;t actually have an example where it could cause a problem tho. But you might try to think thru the ramifications by searing for &quot;current-&quot; in the docs. <br>
<br>Robby<br><br>On Tuesday, October 18, 2011, Neil Toronto &lt;<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>&gt; wrote:<br>&gt; I hear you. If I used any parameters except the plot ones, I&#39;d have a problem, and write macros as you suggest. (Or save and restore the exceptions instead.) For now, I&#39;m trying Matthew&#39;s suggestion, and using this:<br>
&gt;<br>&gt;    (define (parameterize-procedure t)<br>&gt;      (define parameterization (current-parameterization))<br>&gt;      (make-keyword-procedure<br>&gt;       (lambda (kws kw-args . rest)<br>&gt;         (call-with-parameterization<br>
&gt;          parameterization<br>&gt;          (lambda () (keyword-apply t kws kw-args rest))))))<br>&gt;<br>&gt; In plot-pict, it looks like<br>&gt;<br>&gt;    (dc (parameterize-procedure<br>&gt;         (lambda (the-dc x y)<br>
&gt;           (plot/dc ... the-dc x y ...)) ...))<br>&gt;<br>&gt; It seems to work just fine. *crosses fingers* There may be some parameters that slideshow uses that I&#39;m not aware of, though...<br>&gt;<br>&gt; But I think I *want* to save every parameter value. If a user plots a function that uses a parameter, I want the function to use the value as it was on the call to &#39;plot-pict&#39;, not its value later.<br>
&gt;<br>&gt; Neil T<br>&gt;<br>&gt; On 10/18/2011 01:48 PM, Robby Findler wrote:<br>&gt;&gt;<br>&gt;&gt; There are parameterizations, but they pick up all parameters and that<br>&gt;&gt; may make other things go wrong (or you have to be more careful how you<br>
&gt;&gt; look up your parameter values but I think you might object to that on<br>&gt;&gt; similar grounds to the below).<br>&gt;&gt;<br>&gt;&gt; I would probably use the solution you have below, but with some macro<br>&gt;&gt; help. Specifically, in the place where you define all those paramters,<br>
&gt;&gt; use a macro to define them, and then have other macros that<br>&gt;&gt; collaborate with the defining macros to capture and restore the<br>&gt;&gt; parameter values.<br>&gt;&gt;<br>&gt;&gt; Robby<br>&gt;&gt;<br>&gt;&gt; On Tue, Oct 18, 2011 at 2:40 PM, Neil Toronto&lt;<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>&gt;  wrote:<br>
&gt;&gt;&gt;<br>&gt;&gt;&gt; Executive summary: Is there a good way to save a large set of parameter<br>&gt;&gt;&gt; values, or *all* the parameter values, and then restore them when needed?<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; In the new PLoT, much of a plot&#39;s appearance is controlled by parameters. I<br>
&gt;&gt;&gt; use parameters because there are so many appearance-controlling values that<br>&gt;&gt;&gt; passing them into the plot area as arguments would get silly very quickly. I<br>&gt;&gt;&gt; dislike functions with 20 arguments, and I *really* dislike duplicating all<br>
&gt;&gt;&gt; those arguments in every function in a call chain. Parameters are a perfect<br>&gt;&gt;&gt; remedy.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; There&#39;s one problem, though: to produce a slideshow pict of a plot, I need<br>
&gt;&gt;&gt; to do this:<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;    (dc (lambda (the-dc x y)<br>&gt;&gt;&gt;          (plot/dc ... the-dc x y ...)) ...)<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; where &#39;plot/dc&#39; draws a plot on a device context. Because the call to<br>
&gt;&gt;&gt; &#39;plot/dc&#39; is in a thunk, it gets the *current* parameter values, which is<br>&gt;&gt;&gt; very wrong. That makes it impossible to, for example, change the background<br>&gt;&gt;&gt; color of only one plot in a slideshow by doing<br>
&gt;&gt;&gt;<br>&gt;&gt;&gt;    (parameterize ([plot-background  &quot;red&quot;])<br>&gt;&gt;&gt;      (plot-pict ...))<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; The problem is that the pict returned by &#39;dc&#39; calls the drawing thunk<br>
&gt;&gt;&gt; *after* the dynamic scope in which &#39;plot-background&#39; is &quot;red&quot;.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; To fix the problem, I&#39;m doing this:<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;    (define foreground (plot-foreground))<br>
&gt;&gt;&gt;    (define background (plot-background))<br>&gt;&gt;&gt;    (define foreground-alpha (plot-foreground-alpha))<br>&gt;&gt;&gt;    (define background-alpha (plot-background-alpha))<br>&gt;&gt;&gt;    (define font-size (plot-font-size))<br>
&gt;&gt;&gt;    ...<br>&gt;&gt;&gt;    (define animating? (plot-animating?))<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;    (dc (lambda (the-dc x y)<br>&gt;&gt;&gt;          (parameterize ([plot-foreground        foreground]<br>&gt;&gt;&gt;                         [plot-background        background]<br>
&gt;&gt;&gt;                         [plot-foreground-alpha  foreground-alpha]<br>&gt;&gt;&gt;                         [plot-background-alpha  background-alpha]<br>&gt;&gt;&gt;                         [plot-font-size         font-size]<br>
&gt;&gt;&gt;                         ...<br>&gt;&gt;&gt;                         [plot-animating?        animating?])<br>&gt;&gt;&gt;            (plot/dc ... the-dc x y ...))) ...)<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Besides looking evil, it&#39;s barely maintainable. Every time I add an<br>
&gt;&gt;&gt; appearance-controlling parameter, I have to remember to add it to the above<br>&gt;&gt;&gt; incantation. (Actually, there are two.)<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; I&#39;ve had a similar problem with the click-and-drag-to-rotate 3D plots.<br>
&gt;&gt;&gt; Because I was already using threads for that, I just made sure the render<br>&gt;&gt;&gt; thread is always (transitively) a child of the thread in which the call to<br>&gt;&gt;&gt; &#39;plot3d&#39; was made. It therefore inherits the original parameter values.<br>
&gt;&gt;&gt;<br>&gt;&gt;&gt; So I can use threads to save parameter values. I could make a render thread<br>&gt;&gt;&gt; to solve my &#39;plot-pict&#39; problem. But is there a better way?<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Neil T<br>
&gt;&gt;&gt; _________________________________________________<br>&gt;&gt;&gt;  For list-related administrative tasks:<br>&gt;&gt;&gt;  <a href="http://lists.racket-lang.org/listinfo/users">http://lists.racket-lang.org/listinfo/users</a><br>
&gt;&gt;&gt;<br>&gt;<br>&gt;