2
$\begingroup$

I'm trying to add custom downvalues for GeneratingFunction, and to do so I thought I just had to Unprotect it. However, that doesn't work:

Unprotect[GeneratingFunction]
{"GeneratingFunction"}
GeneratingFunction[2] = 3
During evaluation of In[3]:= Set::write: Tag GeneratingFunction in 
GeneratingFunction[2] is Protected. >>

 3
GeneratingFunction[2]
During evaluation of In[4]:= GeneratingFunction::argmu: GeneratingFunction
called with 1 argument; 3 or more arguments are expected. >>

GeneratingFunction[2]

I'm running Mathematica 9 64 bit on Linux. What do I need to do to really remove protection from this symbol?

$\endgroup$

2 Answers 2

8
$\begingroup$

GeneratingFunction by default is not a function: it is a stub which loads corresponding .mx package. You can see this with the following:

ClearAttributes[GeneratingFunction,{Protected,ReadProtected}]
OwnValues@GeneratingFunction

{HoldPattern[GeneratingFunction] :>
System`Dump`AutoLoad[Hold[GeneratingFunction], Hold[GeneratingFunction, GenerateConditions`TopLevelCode], "Discrete`GeneratingFunction`"] /; System`Dump`TestLoad}

The functions ClearAttributes and OwnValues have Hold* attributes and so the above code does not evaluate GeneratingFunction. After first evaluation it's Attributes and Options are redefined by the loaded package:

GeneratingFunction;
Attributes[GeneratingFunction]
Options[GeneratingFunction]

{Protected, ReadProtected}

{Assumptions :> $Assumptions, GenerateConditions -> False, Method -> Automatic, VerifyConvergence -> True}

I do not know why we can't see any top-level code for GeneratingFunction with Information, but Tracing its evaluation reveals a bunch of top-level functions it uses:

Trace[GeneratingFunction[1, n, x], TraceInternal -> True]

For the original discussion of this issue see this answer by Sasha (Wolfram Research) with comments under it.

$\endgroup$
3
$\begingroup$

I do not know why Unprotectdoes not work (bug, feature?). The following does work though:

ClearAttributes[GeneratingFunction, Protected]
GeneratingFunction[2] = 3
GeneratingFunction[2]

3

$\endgroup$
5
  • $\begingroup$ hmm, that's not working for me $\endgroup$
    – Andrew
    Sep 17, 2013 at 22:37
  • 1
    $\begingroup$ clearing the attribute, attempting to set a value, receiving an error, then clearing the attribute again and setting a value seems to work though $\endgroup$
    – Andrew
    Sep 17, 2013 at 22:39
  • 2
    $\begingroup$ @Andrew May be the situation is similar to this? $\endgroup$ Sep 18, 2013 at 2:11
  • 1
    $\begingroup$ @AndrewMacFie: You need to run it twice so Wolfram can confirm your intentions with absolute certainty. ;-) On a serious note, what kind of "feature" is that?! $\endgroup$
    – Hector
    Sep 18, 2013 at 3:49
  • $\begingroup$ @AlexeyPopkov ah yes... this question is very similar to that one $\endgroup$
    – Andrew
    Sep 18, 2013 at 20:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.