Re: Default Symbol Names in Package Functions
- To: mathgroup at smc.vnet.net
- Subject: [mg96129] Re: Default Symbol Names in Package Functions
- From: dh <dh at metrohm.com>
- Date: Fri, 6 Feb 2009 04:11:38 -0500 (EST)
- References: <gmec67$a8j$1@smc.vnet.net>
Hi David,
of course you can not have your bred buttered both ways. But there are
work arounds. You may set the default value not to a symbol but to
something else, e.g. a string and then check if the argument is a
string. If it is you may test if x already exists, e.g. by:
Names["x"]==={}
If it exists, you could give a warning and use e.g. a unique name:
Unique[]. If no, simply define Golbal`x.
hope this helps, Daniel
David Park wrote:
> Suppose that I have a routine that generates or tests an expression in terms
> of a variable. For example, I might have something like:
>
>
>
> foo1[var_]:=var^2+var+1
>
>
>
> Then a user can generate the polynomial expression in any variable that she
> specifies. But then I realize that most the time the user will use 'x' as
> the variable symbol. So I use a default argument as follows:
>
>
>
> foo1[var_: x] := var^2 + var + 1
>
>
>
> However, when I put this in a package it doesn't work because the private
> package context gets used on the default symbol.
>
>
>
> BeginPackage["TestPackage`"];
>
> foo::usage="foo[var] uses an argument with a default value.";
>
> Begin["`Private`"];
>
> foo[var_:x]:=var^2+var+1;
>
> End[];
>
> EndPackage[];
>
>
>
> foo[]
>
> 1 + TestPackage`Private`x + TestPackage`Private`x^2
>
>
>
> So, I think I know how to fix that. I just specify a Global context for the
> default value.
>
>
>
> BeginPackage["TestPackage`"];
>
> foo::usage="foo[var] uses an argument with a default value.";
>
> Begin["`Private`"];
>
> foo[var_:Global`x]:=var^2+var+1;
>
> End[];
>
> EndPackage[];
>
>
>
> foo[]
>
> 1 + x + x^2
>
>
>
> But this mechanism gives me two problems:
>
>
>
> 1) When the package is loaded it creates the symbol Global`x. If there is
> another package that creates the symbol SecondPackage`x, say, then there is
> a conflict and among other things the symbol gets colored in red. (I
> actually have a case of this with another person's very good package.)
>
>
>
> 2) If I have a somewhat more general function foo[expression_,
> var_:Global`x] where some tests are done on expression in terms of the
> variable x, then when I try to document this in a Version 6 function page,
> it doesn't work. That is because any expression in x in the documentation
> page will have a special CellContext that does not match Global`x.
>
>
>
> So I conclude that one should just not use default arguments that pass
> symbol names in package functions. There are too many potential problems.
> Make the user always enter the symbol. Still, I wonder if anyone has some
> better idea for doing this?
>
>
>
> David Park
>
> djmpark at comcast.net
>
> <http://home.comcast.net/~djmpark> http://home.comcast.net/~djmpark/
>
>