0
$\begingroup$

It happens to me a lot when I write a loop, I have to Clear all functions, variables, definitions and etc to be sure my calculations is done correctly. namely as a toy example:

a=1;
b=2;
Do[
Clear[fun1,fun2,fun3];      
fun1[x_]:=a+bx+c;
fun2[x_]:=b+ax+c;
fun3=fun1[x]+fun2[x];
,{c,{1,4,10}}]

Usually I have a lot of things (similar to above funs) which must be cleared inside my loop. In fact there is a complicated algorithm inside the loop which has inner loops itself. I do one of these:

1-If I need to save loop data in a matrix for example using Reap and Sow I have to use Clear[all things that I want to be cleared] manually

2- If I export data loop at each stage using Export or Put I just write ClearAll["Global`*"] at the first of my loop. However most of time 1 is the case and it's a very time-consuming to clear all things manually. So I look for a way for clearing all things inside loop without clearing things outside it. Or it is better to ask: how can I use ClearAll["Global`*"] but exclude a few functions? Any idea?

$\endgroup$
10
  • 1
    $\begingroup$ You'll have to give us example code, as simple as possible, for how the problem arises. It simply doesn't happen for most of us. There's something about Mathematica that you're fighting rather than using. $\endgroup$
    – John Doty
    Oct 15, 2021 at 11:28
  • $\begingroup$ but they are about ~60 functions which I had to define respectively $\endgroup$
    – Wisdom
    Oct 15, 2021 at 11:49
  • 1
    $\begingroup$ Why are you doing it this way, going back around and redefining functions, using them , then clearing them in a loop, all just to change parameters? This is inefficient - you should define your functions once and use the arguments from the call-site to change the behaviour. For example, in your code you should have fun1[x_,c_]:=..., fun2[x_,c_]:=... defined once, instead of the loop and redefinitions. That way you can easily call fun3=Table[fun1[x,c]+fun2[x,c], {c,1,4,10}] $\endgroup$
    – flinty
    Oct 15, 2021 at 12:06
  • 1
    $\begingroup$ If you want to try again, I would point out that in your MWE, there is no need to Clear the previous definitions. It makes it harder to imagine a situation in which you would. $\endgroup$
    – Michael E2
    Oct 15, 2021 at 13:00
  • 1
    $\begingroup$ The comment of @flinty is very relevant. It is unconventional to define and clear definitions in a loop. If it needs to be done, then it is against the very idea of a function, module, etc. They should be re-usable not one time objects. $\endgroup$
    – yarchik
    Oct 15, 2021 at 13:59

1 Answer 1

1
$\begingroup$

Here's how I would write your example, in a way that "jibes" with Mathematica.

(* Define the functions in terms of parameters *)
fun1[a_, b_][c_][x_] := a + b x + c
fun2[a_, b_][c_][x_] := b + a x + c
fun3[a_, b_][c_][x_] := fun1[a, b][c][x] + fun2[a, b][c][x]

(* Specify the parameters' values *)
a = 1; b = 2; c = {1, 4, 10};

(* Rather than loop, map across c *)
Through[(fun3[a, b] /@ c)@x]

(* Result *)
{5 + 3 x, 11 + 3 x, 23 + 3 x}
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.