3
$\begingroup$

I have a notebook containing (in a Code cell, Initialization Group)

BeginPackage["aPackage`"]; aTestFunction::usage = "aTestFunction usage"; Begin["`Private`"]; (* Remove[aTestFunction]; *) aTestFunction[arg_] := arg + 1; Protect[aTestFunction]; End[]; EndPackage; 

and further

Needs["aPackage`", NotebookFileName[]]; ?aTestFunction aTestFunction[1] Quit[]; 

All that honestly earns its pay. But if I de - comment the Remove command, it produces.

Information::notfound: "Symbol aTestFunction not found."

and I can' t realize the reason. All things considered, Remove removes the aTestFunction symbol (provided that it exists) from the aPackage context but should not prevent it from being defined at a later time. It sounds quite different from what one can observe in the Global context: this

Context[] a = 1; Remove[a]; a = 2; a + 1 

returns

Global 3 

.

$\endgroup$
1

1 Answer 1

3
$\begingroup$

Shortly:

Here what is going on, aTestFunction was created in aPackage` context, then you've removed it and since the current context is aPackage`Private` the definition of your function is created there.

More precisely:

New symbols are created in current $Context during read time, (1) the existance of aTestFunction between BeginPackage and Begin lines makes the aTestFunction an exported symbol (that means in aPackage`, because the symbol was not found and the current $Context is apackage`).

After (2) Remove it's no longer there and (3) your definition is read in aPackage`Private` context. But aPackage`Private` is not going to be on $ContextPath or $Context after EndPackage[] so it is not found by ?.

I'm strongly encouraging to read a very nice answer of Szabolcs:

How symbol lookup actually works

BeginPackage["aPackage`"]; aTestFunction::usage = "aTestFunction usage"; (*1*) Begin["`Private`"]; Remove[aTestFunction]; (*2*) aTestFunction[arg_] := arg + 1; (*3*) Protect[aTestFunction]; End[]; EndPackage; 

? aTestFunction 

Information::notfound: Symbol aTestFunction not found. >>


? aPackage`Private`aTestFunction 

enter image description here

$\endgroup$
2
  • $\begingroup$ Hello ! Thanks for your reply ! It's all clear now. I think that my oversight was in leaving behind that usage command is totally different from a simple string assignment. $\endgroup$ Commented Apr 8, 2016 at 13:59
  • $\begingroup$ @AlbertRetey ok, let's. Thanks for help. $\endgroup$ Commented Apr 11, 2016 at 16:49

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.