Strange behavior when using pattern match and HoldAll
The group you are posting to is a
Usenet group . Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
Newsgroups: comp.soft-sys.math.mathematica
From:
dnquark <dnqu... @gmail.com>
Date: Sat, 7 Nov 2009 11:49:37 +0000 (UTC)
Local: Sat 7 Nov 2009 11:49
Subject: Strange behavior when using pattern match and HoldAll
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?..
Thanks, --Leo
You must
Sign in before you can post messages.
You do not have the permission required to post.
Newsgroups: comp.soft-sys.math.mathematica
From:
Leonid Shifrin <lsh... @gmail.com>
Date: Sun, 8 Nov 2009 11:50:42 +0000 (UTC)
Local: Sun 8 Nov 2009 11:50
Subject: Re: Strange behavior when using pattern match and HoldAll
Leo, Hold-attributes do affect the pattern-matching. Have a look at
http://www.mathprogramming-intro.org/book/node408.html
where I specifically discuss this topic using an example similar to yours.
Regards, Leonid
On Sat, Nov 7, 2009 at 3:50 AM, dnquark <dnqu
... @gmail.com> wrote:
> 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?..
> Thanks, > --Leo
You must
Sign in before you can post messages.
You do not have the permission required to post.
Newsgroups: comp.soft-sys.math.mathematica
From:
Albert Retey <a... @gmx-topmail.de>
Date: Sun, 8 Nov 2009 12:27:20 +0000 (UTC)
Local: Sun 8 Nov 2009 12:27
Subject: 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
>
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
You must
Sign in before you can post messages.
You do not have the permission required to post.