MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Assigning part of indexed object

  • To: mathgroup at smc.vnet.net
  • Subject: [mg119845] Re: Assigning part of indexed object
  • From: Oleksandr Rasputinov <oleksandr_rasputinov at hmamail.com>
  • Date: Sat, 25 Jun 2011 05:28:21 -0400 (EDT)
  • References: <itsjn7$8u7$1@smc.vnet.net> <itv7ve$pbu$1@smc.vnet.net> <iu1tp3$9kr$1@smc.vnet.net>

Regarding consistency, it is worth noting that there is a
problem with ReplacePart as a direct substitute for Set:

m = Range[5];

ReplacePart[m, 1 -> 10] :> {10, 2, 3, 4, 5}

but

m[[1]] = 10 :> ( m = {10, 2, 3, 4, 5}; 10 ) :> 10

the following is thus a better solution than what I had
posted previously:

Unprotect[Set];
Set[sym_[[part_]], val_] := (
  sym = ReplacePart[sym, part -> val];
  sym[[part]]
 );
Protect[Set];

Now:

Clear[m]; (* OwnValues will override DownValues *)
m[1] = Range[5];

m[1][[1]] = 10 :> ( m[1] = {10, 2, 3, 4, 5}; 10 ) :> 10

which is consistent with other uses of Set.

On Jun 24, 12:52 pm, "Fabrice P. Laussy" <fabrice.lau...@n0spam-
gmail.com> wrote:
> Dear all,
>
> Thanks for the solution. Supplemented with Oleksandr Rasputinov's fix:
>
> > Unprotect[Set];
> > Set[sym_[[part_]], val_] := sym = ReplacePart[sym, part -> val];
> > Protect[Set];
>
> it works splendidly.
>
> In "some elements of Mathematica Design (1992)" [http://goo.gl/nm1tT],
> Stephan Wolfram makes a point where one should resist the temptation to
> design functions to do things that look natural for them to do, as they
> could break dramatically later on.
>
> Here we have a clear case where Set seems it ought to work as redesigned by
> Oleksandr. Is there any reason for this not being the default behaviour?


  • Prev by Date: Re: what's in a name? (legal and conventional constructions of identifiers)
  • Next by Date: HDF5
  • Previous by thread: Re: Assigning part of indexed object
  • Next by thread: Re: Assigning part of indexed object