RE: Holding Arguments in a Second Argument List

*To*: mathgroup at smc.vnet.net*Subject*: [mg32296] RE: [mg32238] Holding Arguments in a Second Argument List*From*: "David Park" <djmp at earthlink.net>*Date*: Fri, 11 Jan 2002 04:35:35 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

Thanks Andrzej, Allan, Hartmut and Jens for your various solutions. Allan's solution worked out best for me. Here is a little sample routine to show how it works. I am writing routines to do various operations on an extended matrix structure, so the actual routines are a little more complicated than below. Since I want to reassign parts of the structure, the passed matrix symbol must be unevaluated. If the input arguments are in error I want to give error messages and Abort, which is easy enough. But sometimes I don't want to issue messages or abort the whole operation, but only return a $Failed to the calling routine which can then handle it. The following routine scales a row of a matrix by a scale factor, but returns $Failed if a nonexistent row is specified. scalerow[row_, scale_] := Function[matrix, Catch[ Module[{r}, r = First[Dimensions[matrix]]; If[ !1 <= row <= r, Throw[$Failed]]; matrix[[row]] = scale*matrix[[row]];]], {HoldFirst}] testmat = {{1, 2}, {4, 2}}; This is OK... mat = testmat; mat // scalerow[1, 2] mat {{2, 4}, {4, 2}} This fails because there is no row 3 mat = testmat; mat // scalerow[3, 2] mat $Failed {{1, 2}, {4, 2}} David Park djmp at earthlink.net http://home.earthlink.net/~djmp/ > From: David Park [mailto:djmp at earthlink.net] To: mathgroup at smc.vnet.net > > 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/ > >