Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2002
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2002

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

Search the Archive

RE: Holding Arguments in a Second Argument List

  • To: mathgroup at smc.vnet.net
  • Subject: [mg32295] RE: [mg32238] Holding Arguments in a Second Argument List
  • From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.de>
  • Date: Fri, 11 Jan 2002 04:35:33 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

Dear David,

I remember this question had already come up in MathGroup, but I can't find
my answer to it on any of my disks. Here I report on the same idea, possibly
in better guise. Please see below:

> -----Original Message-----
> From: David Park [mailto:djmp at earthlink.net]
To: mathgroup at smc.vnet.net
> Sent: Wednesday, January 09, 2002 9:18 AM
> To: mathgroup at smc.vnet.net
> Subject: [mg32295] [mg32238] Holding Arguments in a Second Argument List
> 
> 
> Dear MathGroup,
> 
> I have a series of procedures which manipulate a matrix. I 
> like to define
> them in this fashion.
> 
> function[args___][matrix_] := ... because then I can write lines like
> 
> matrix // function[args...] etc.
> 
> But I have to define the function so that matrix is held, and 
> I don't want
> to write Unevaluated with every use. But Attributes = {HoldFirst} only
> applies to the first argument list. Is there a direct way to 
> define the
> attributes of a second argument list?
> 
> In any case, I write the routines this way.
> 
> function[args___]:=
> 	Function[matrix,
> 		Module[{}, code],
> 		{HoldFirst}]
> 
> and that works. The code usually changes the matrix and I display it
> separately. But sometimes the operation will fail and then I 
> would like
> 
> function[args...][matrix]
> 
> to return $Failed. But I am unable to do that. The best I 
> seem to be able to
> do is return Return[$Failed].
> 
> Here is a sample routine which just tries to return $Failed.
> 
> foo[mathgroup_] :=
>   Function[mat,
>     Module[{},
>         If[Not[mathgroup === great], Return[$Failed]]],
>     {HoldFirst}]
> 
> foo[x][mat]
> Return[$Failed]
> 
> Can anyone tell me how to get rid of the Return wrapper?
> 
> Thanks
> 
> David Park
> djmp at earthlink.net
> http://home.earthlink.net/~djmp/
> 
> 
This is my test example, it works with DownValues:

In[1]:= SetAttributes[g, HoldAll]
In[2]:= g[matrix_] := Dimensions[Unevaluated[matrix]]
In[3]:=
g[{Print["ho"], Print["and lo"]; Unevaluated[Sequence[]]}]
Out[3]=
{2}
 
Nothing printed and matrix has not collapsed.

It doesn't work with SubValues:

In[4]:= SetAttributes[f, HoldAll]
In[5]:= f[args___][matrix_] := Dimensions[Unevaluated[matrix]]
In[6]:=
f[1][{Print["ho"], Print["and lo"]; Unevaluated[Sequence[]]}]
>From In[6]:=
"ho"
>From In[6]:=
"and lo"
Out[6]=
{1}

The trick now is to introduce an intermediate Symbol g1 here which is given
the Hold Attribute: 

In[8]:= SetAttributes[g1, HoldAll]
In[9]:= g1[args___, matrix_] := Dimensions[Unevaluated[matrix]]
In[10]:=
g1[1, {Print["ho"], Print["and lo"]; Unevaluated[Sequence[]]}]
Out[10]=
{2}

It works of course; now the definition for f (called f1 here), and no
Attributes needed for that one.

In[11]:= f1[args___] := Sequence[Null, g1[args, #], {HoldAll}] &

(Just for joking, we normally write up this differently.) 
Now you have got what you want:

In[13]:=
{Print["ho"], Print["and lo"]; Unevaluated[Sequence[]]} // f1[1]
Out[13]=
{2}

Yours, Hartmut



  • Prev by Date: Interpolation
  • Next by Date: Front-End
  • Previous by thread: RE: Holding Arguments in a Second Argument List
  • Next by thread: Re: How to call BinomialDistribution from within a package?[2]