Re: Orderless attribute for named functions and function arguments
- To: mathgroup at smc.vnet.net
- Subject: [mg72534] Re: Orderless attribute for named functions and function arguments
- From: dh <dh at metrohm.ch>
- Date: Fri, 5 Jan 2007 02:10:11 -0500 (EST)
- References: <enip11$hf9$1@smc.vnet.net>
Hi Hannes,
it is not clear if you want to use the syntax: "f[functionName_String]"
simply as a name or as a function. The former is against the rules how a
name must be formed, "[" and "]" are not allowed. The latter works if
you give the returned function the attribute Orderless. E.g:
f[]:=Module[{a},
SetAttributes[a,Orderless];
a[x1_,x2_]:=x1/x2;
a
]
Daniel
Hannes Kessler wrote:
> Dear experts,
>
> a way to use the attibute Orderless that works for functions with named
> arguments in the form of rules is
>
> SetAttributes[f,Orderless];
> f[
> "Named argument 1" -> x_,
> "Named argument 2" -> y_,
> "Named argument 3" -> z_]:=
> Module[{xx, yy, zz},
> {xx, yy, zz} = {x, y, z};
> (*Do something with xx, yy, zz and return the result*)
> ...];
>
> Calling the function with arguments in different ways gives identical
> results.
> No need to care about the order of the named arguments:
>
> f1 = f[
> "Named argument 1" -> 1,
> "Named argument 2" -> 2,
> "Named argument 3" -> 3];
> f2 = f[
> "Named argument 2" -> 2,
> "Named argument 1" -> 1,
> "Named argument 3" -> 3];
> f1 == f2
> --> True
>
> Now I want an additional dependence of the result on a name of the
> function in the following form:
>
> f[functionName_String][
> "Named argument 1" -> x_,
> "Named argument 2" -> y_,
> "Named argument 3" -> z_]:=
> Module[{xx, yy, zz},
> {xx, yy, zz} = {x, y, z};
> (*Do something with xx, yy, zz*)
> ...;
> (*Return the result depending on functionName*)
> Which[
> MatchQ[functionName, "func1"], value1,
> MatchQ[functionName, "func2"], value2,
> ...]];
>
> However, it is not possible anymore to assign the attribute Orderless
> as
>
> SetAttributes[f[functionName_String],Orderless];
>
> generates an error message:
>
> SetAttributes::sym: Argument f[functionName_String] at position 1 is
> expected \
> to be a symbol.
>
> A simple solution is to reverse the definition of f:
>
> SetAttributes[f,Orderless];
> f[
> "Named argument 1" -> x_,
> "Named argument 2" -> y_,
> "Named argument 3" -> z_][functionName_String]:=...
>
> Is there another way to reach the same goal? Reversing the definition
> of f is of course completely acceptable in most cases. Nevertheless, in
> some cases it may preferrable to view f[functionName] as different
> functions specified by the string functionName, and the arguments to
> these functions should be given in any order.
>
> Thanks in advance,
> Hannes Kessler
>