Re: Deleting a DownValue, Evaluate[f@@argList]=. does not do it

• To: mathgroup at smc.vnet.net
• Subject: [mg20796] Re: Deleting a DownValue, Evaluate[f@@argList]=. does not do it
• From: "Allan Hayes" <hay at haystack.demon.co.uk>
• Date: Sun, 14 Nov 1999 18:13:48 -0500 (EST)
• References: <80au96\$j2i@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```Adalbert,

Some experiments:

(1) ------------ One-at-a-time setting and unsetting ---------------

Clear[f];
f[1] = 1;
f[2, 3] = 2;

?f

Global`f
f[1] = 1

f[2, 3] = 2

Block[{f, Unset}, f @@ {2, 3} =.]

?f

Global`f
f[1] = 1

( we had to block f to stop it evaluating f[2,] to 1 immediately - this is
what gave the problem that you found; and we had to block Unnset so that it
did not hold its entry as f@@{1})

We can also use a pure function:

(f[##] =.) & @@ {1};

?f

Global`f

(2)  ----------- Lists of inputs and values -------------------

- two ways (a) using Block, (b) using a pure function

(a) Using Block

Clear[f]
Block[{Set, f}, f @@@ {{1}, {2, 3}, {4}, {5}} = {1, 2, 3, 4}];

?f

Global`f
f[1] = 1

f[4] = 3

f[5] = 4

f[2, 3] = 2

Block[{Unset, f}, f @@@ {{2, 3}, {5}} =.];

?f

Global`f
f[1] = 1

f[4] = 3

*Note*: Unset[{e1,e2 ..}] unsets each of e1, e2 ...  .

(b) Using a pure function

Clear[f]
MapThread[(f[Sequence @@ #1] = #2) &, {{{1}, {2, 3}, {4}, {5}}, {1, 2, 3,
4}}];

?f

Global`f
f[1] = 1

f[4] = 3

f[5] = 4

f[2, 3] = 2

(f[##] =.) & @@@ {{2, 3}, {5}};

?f

Global`f
f[1] = 1

f[4] = 3

Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565

<hanssen at zeiss.de> wrote in message news:80au96\$j2i at smc.vnet.net...
> Hi, MathGroup,
>
> f[1]=1;
> f[2]=2;
> ?f
>
> yields
>
> "Global`f"
> f[1] = 1
> f[2] = 2
>
> now get rid of definition for 1
>
> f[1]=.;
> ?f
>
> yields
>
> "Global`f"
> f[2] = 2
>
>
> So far, it works as expected. I want to memorize results for combinations
of arguments
> like f[a,b,c]=results and so on. To do this, I write f@@argList. Now I
demonstrate
> this on lists with length 1, to make it simple. When making the
assignment, it has to be
> wrapped in Evaluate:
>
> Clear[f];
> Evaluate[f@@{1}]=1;
> Evaluate[f@@{2}]=2;
> ?f
>
> yields
>
> "Global`f"
> f[1] = 1
> f[2] = 2
>
> as before. Now I want to get rid of the definition for 1 in the analogous
way:
>
> Evaluate[f@@{1}]=.
>
> yields
>
> Unset::usraw: Cannot unset raw object !
> \$Failed
>
> How to proceed without searching through DownValues[f] and deleting
> the one meant - very awkward?
>
> kind regards
>