side-effect when evaluating a function | pca | 7/25/09 12:31 PM | Dear all,
I have been puzzled, and annoyed, by an unexpected side-effect. It can be demonstrated in the notebook by the following example. It models the speed as distance / time, then solve for the distance, then evaluate the distance with different arguments: var('v d t') equation = v == d / t solution = solve(equation, d, solution_dict = True) d_ = solution[0][d]; print d_ #-> t*v constants= {v: 2} print d_(constants, t=3) #--> 6 # BEWARE: the previous call has the side effect that t=3 in later evaluation ! print d_(constants) #--> 6 : the side-effect is apparent here ! print d_ #--> t*v I would expect d_(constants) to result in t*2, but instead its using a previous assignment of t to yield 6 ! I'm using Sage for an engineering pblm, and I find it useful to separate constants from arguments. The side effect is thus annoying to me: is there any other way to evaluate a function with constants and arguments, without any side-effect with the arguments ? I'm new to this forum, so not sure if it has been raised before. Sorry if there is an easy answer. Thanks in advance. PC |

unk...@googlegroups.com | 7/25/09 12:43 PM | <This message has been deleted.> | |

Re: side-effect when evaluating a function | pca | 7/25/09 12:51 PM | Thank you for your quick answer, Minh.
Although it would give the correct answer, it does not satisfy my wish to distinguish constants from parameters. In my engineering pblm, I have a set of several constants that I use in many statements, and I wish to keep them together nicely, and use them in only one keyword. In your solution, I would have to repeat them every time, and this is not convenient. Any idea why Sage behaves as it does, and how to circument this strange behavior while keeping the "constant" idea ? Thanks PC On 25 juil, 21:43, Minh Nguyen <nguyenmi...@gmail.com> wrote: > Hi Pierre, > Is the following what you're looking for? > > ---------------------------------------------------------------------- > | Sage Version 4.1, Release Date: 2009-07-09 | > | Type notebook() for the GUI, and license() for information. | > ---------------------------------------------------------------------- > sage: var("v, d, t"); > sage: equation = v == d/t > sage: solution = solve(equation, d, solution_dict=True) > sage: solution > [{d: t*v}] > sage: sol_d = solution[0][d]; sol_d > t*v > sage: sol_d.substitute(v=2) > 2*t > sage: sol_d.substitute(t=3) > 3*v > sage: sol_d.substitute(t=3, v=2) > 6 > sage: sol_d > t*v > > -- > Regards > Minh Van Nguyen |

Re: [sage-support] side-effect when evaluating a function | William | 7/25/09 1:07 PM | On Sat, Jul 25, 2009 at 12:31 PM, pca<pierre.ca...@gmail.com> wrote:This is *definitely* a bug in Sage. I've made this trac #6622: http://trac.sagemath.org/sage_trac/ticket/6622 Here's how to workaround it (namely, put "dict(constants)" instead of "constants"): sage: var('v t') sage: f = v*t sage: s = {v: 2} sage: f(dict(s), t=3) 6 sage: s {v: 2} William -- William Stein Associate Professor of Mathematics University of Washington http://wstein.org |

Re: side-effect when evaluating a function | pca | 7/25/09 1:19 PM | GREAT ! Thanks for the amazing support !
I have just used Sage for one day, and I was disappointed by this side- effect. But with such an outstanding support, I'm now convinced it's the tool to use ! PC On 25 juil, 22:07, William Stein <wst...@gmail.com> wrote: |