7
$\begingroup$

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?

$\endgroup$
  • 2
    $\begingroup$ how about chrom = Unevaluated[chrom] now it is not blue anymore next time it is typed. and no value is associated with it either. $\endgroup$ – Nasser Jan 7 '14 at 0:02
  • 2
    $\begingroup$ yes, 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 :) $\endgroup$ – Nasser Jan 7 '14 at 0:14
  • 1
    $\begingroup$ Because 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 $\endgroup$ – Nasser Jan 7 '14 at 0:22
  • 1
    $\begingroup$ @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? $\endgroup$ – becko Jan 7 '14 at 0:37
  • 1
    $\begingroup$ @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. $\endgroup$ – halirutan Jan 7 '14 at 0:45
11
$\begingroup$

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

$\endgroup$
  • $\begingroup$ related: mathematica.stackexchange.com/q/39957/534 $\endgroup$ – becko Jan 7 '14 at 13:40
  • 2
    $\begingroup$ @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. $\endgroup$ – b3m2a1 May 23 '17 at 18:38
  • $\begingroup$ @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? $\endgroup$ – Mr.Wizard May 23 '17 at 18:42
  • $\begingroup$ @Mr.Wizard I think it might be best to include it in yours. You already have two methods, so a third doesn't hurt. $\endgroup$ – b3m2a1 May 23 '17 at 18:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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