Forcing Mathematica to recognize a symbol without defining it

9

2

In the Mathematica front-end, symbols that have been defined are colored black and symbols with no definition associated are colored blue. This is useful to prevent spelling mistakes. Also, defined symbols appear in the autocomplete (as of Mathematica v9.0).

I have a symbol chrom with no definitions associated, but I want Mathematica to recognize it. That is, I want that when I type chrom in the front end, it appears colored black, and I want it to appear in the autocomplete.

I can't associate a definition with chrom (as in chrom = ... or chrom[..] = .., because then if chrom appears in the evaluation of an expression, it will be replaced by the associated defined value. This is not the behavior I want.

In other words, is there a Mathematica function that does the opposite of Remove? Remove removes a symbol from the symbol table. How can I add a symbol to the symbol table without associating a definition with it?

becko

Posted 2014-01-06T23:55:04.897

Reputation: 10 287

2how about chrom = Unevaluated[chrom] now it is not blue anymore next time it is typed. and no value is associated with it either. – Nasser – 2014-01-07T00:02:51.047

Isn't that the same as just entering n = n ? – heropup – 2014-01-07T00:11:09.310

@Nasser ... seems to work, but I'm not sure I understand why. Isn't chrom = Unevaluated[chrom] the same as chrom = chrom? – becko – 2014-01-07T00:12:07.680

@heropup same as what you said... didn't see your comment – becko – 2014-01-07T00:13:33.593

2yes, n=n will also work. So now you have 2 ways to do it. I am sure where are more. Pick the one you like :) – Nasser – 2014-01-07T00:14:00.110

@Nasser I don't understand why chrom = chrom doesn't produce an infinite loop when chrom is evaluated? – becko – 2014-01-07T00:15:13.223

1Because chrom it an atomic symbol when first starting notebook. i.e. there are no values associated with it. Hence evaluation will stop and return the symbol chrom as result of evaluation, and assign this result to chrom itself. So chrom points to its self. A self referential pointer. But since chrom now is entered in Mathematica internal symbols lookup table, it become black colored. It does not matter than it points to itself, as long as it is in the symbol table, it is colored black. So n=n is trick to force n to be added to the symbol table. Just like n=3 adds it to the symbol table – Nasser – 2014-01-07T00:22:33.497

1@Nasser After chrom = chrom has been evaluated, chrom is in the symbol table, pointing to itself. That's OK. After that I evaluate chrom. Since at this point chrom is pointing to itself, why it isn't replaced with chrom, which in turn is replaced with chrom, and so on? – becko – 2014-01-07T00:37:05.883

1@Nasser Of course is chrome defined when you do chrom = Unevaluated[chrom]! You just have to look at the return value when you evaluate the line, because Set returns what has been assigned. If you still need further proof then check OwnValues[chrom]. Same argument is true for chrom=chrom btw. – halirutan – 2014-01-07T00:45:12.343

Answers

12

Update

In a comment MB1965 proposed an undocumented but apparently canonical function to do this in recent versions. It is DeclareKnownSymbols. It takes a String or list of Strings, e.g.:

DeclareKnownSymbols[{"var", "res"}]

After this var and res are colored as known Symbols.


As far as I know the syntax highlighting for defined Symbols depends on one of the Symbol's *Values lists being non-empty. As suggested in the comments one way, and perhaps the best, is to simply assign the Symbol to itself:

symbol = symbol

OwnValues[symbol]
{HoldPattern[symbol] :> symbol}

Other rules existing in one of the *Values lists also work, even invalid ones:

Remove[symbol]

OwnValues[symbol] = {1 -> 1};

This rule will be replaced as soon as symbol is assigned:

symbol = None;

OwnValues[symbol]
{HoldPattern[symbol] :> None}

Another approach is to define a context coloring for your Symbols, and specifically create all of them in that context. First define the coloring Option and add the context to the $ContextPath:

SetOptions[$FrontEndSession, 
 AutoStyleOptions -> {"SymbolContextStyles" -> {"highlight`" -> Green}}]

AppendTo[$ContextPath, "highlight`"];

Then simply list your fully-qualified Symbols to create them:

{highlight`symbol1, highlight`symbol2, highlight`symbol3};

At this point the plain Symbol names will be highlighted as specified:

enter image description here

Mr.Wizard

Posted 2014-01-06T23:55:04.897

Reputation: 259 163

related: http://mathematica.stackexchange.com/q/39957/534

– becko – 2014-01-07T13:40:36.803

2@Mr.Wizard there's actually a way for to do what the OP wanted. Not sure if it existed back in '14 though. Just use DeclareKnownSymbols. e.g. DeclareKnownSymbols["test"] will declare the symbol test but test doesn't need values. This works via the UpdateKernelSymbolContexts FE packet. – b3m2a1 – 2017-05-23T18:38:44.880

@MB1965 If it existed in the version I used I had not seen it. I did see and vote for your recent Q&A using it however. Do you care to post this as an answer, or would you like me to include it in mine? – Mr.Wizard – 2017-05-23T18:42:31.457

@Mr.Wizard I think it might be best to include it in yours. You already have two methods, so a third doesn't hurt. – b3m2a1 – 2017-05-23T18:50:23.160