MathGroup Archive 2009

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

Search the Archive

Re: Strange behavior when using pattern match and HoldAll

dnquark schrieb:
> I am using HoldAll with a function that I would like to modify a list
> passed to it, as described on
> 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:

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;


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



  • 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