Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2009

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

Search the Archive

Re: Strange behavior when using pattern match and HoldAll

  • To: mathgroup at smc.vnet.net
  • Subject: [mg104764] Re: Strange behavior when using pattern match and HoldAll
  • From: Albert Retey <awnl at gmx-topmail.de>
  • Date: Sun, 8 Nov 2009 07:28:05 -0500 (EST)
  • References: <hd3msh$9rq$1@smc.vnet.net>

dnquark schrieb:
> I am using HoldAll with a function that I would like to modify a list
> passed to it, as described on
> http://forums.wolfram.com/student-support/topics/21247
> I wrote this:
> 
> Clear[test]; Remove[test];
> SetAttributes[test, HoldAll]
> test[list_List, val_] := list[[2]] = val;
> 
> This doesn't work:
> lst = {4, 5, 6};
> test[lst, 99];
> lst
> 
> gives {4,5,6}
> 
> However, test[list_, val_] := list[[2]] = val  works.
> 
> Similarly,
> Clear[foo]; Remove[foo];
> SetAttributes[foo, HoldAll]
> foo[list_List] := list[[2]];
> lst={1,2,3}; foo[lst]
> 
> doesn't work.
> Can someone explain why HoldAll changes the behavior of the function
> depending on whether the argument pattern is specified as x_ or
> x_List?..

Because of the HoldAll attribute the argument is the symbol lst, not
it's value, the List {1,2,3}. This is why it doesn't match the pattern
_List but _Symbol and thus the function body is never executed. You can
check that this works:

Clear[test];
SetAttributes[test, HoldAll];
test[list_Symbol, val_] := list[[2]] = val;

If you want to test whether the value of the symbol is a list, you could
do something like this:

test[list_Symbol?(Head[#] == List &),val_]:= list[[2]]=val;

or:

test[list_Symbol /; Head[list] === List, val_] := list[[2]] = val;


hth,

albert


  • Prev by Date: Re: fitting
  • Next by Date: Re: find subsets
  • Previous by thread: Re: Strange behavior when using pattern match and HoldAll
  • Next by thread: Function returns null