There is a special case of language in which the use-mention distinction is particularly vital: computer languages, with pointers. Just like in human languages, it provides great power - but it is also a great cause of errors, especially for programmers who are copying code examples without comprehension of what's going on.

Let's look at this pseudo-C/C++ fragment.

// we have an independently initialized pair of pointers-to-int, foo and bar.
*foo = 0; *bar = 0;// this means that the contents of the addresses (hereafter 'data') pointed to by foo and bar are both assigned the value 0.

// Now let's check some equalities.

*foo == *bar; // true. The data pointed to by foo and bar are both 0. This would be a use of what foo and bar are pointing at.
foo == bar; // false. Foo and bar point to different addresses. This would be a use of foo and bar, and a mention of what they point at.
&foo == &bar; // false. Foo and bar themselves have different addresses. This is use of the implicit underlying structure of foo and bar, a mention of foo and bar themselves.
// now assign bar to foo, just to complicate matters...
delete bar; // the address pointed to by bar is now history. For C, free(bar).
bar = foo; // assign bar to point to the same address that foo does.

// and try checking some more equalities.
*foo == *bar; // still true...
*foo = 3; // change the data in address pointed-to by foo to 3 rather than 0.
*foo == *bar; // STILL true, since foo and bar are pointing at the same address.
foo == bar; // true, for the reason demonstrated above - pointing to same address.
&foo == &bar; // false. Foo and bar are still distinct variables, so THEIR addresses differ.

Things get even more complicated when we add pointers-to-pointers. That would be akin to "Tommy asked, "Did Katie say, "Devilbunny needs a ham!"?".".¹

All of this is rather different from standard languages, in which one does not normally work on the second level, with values that are mutable. Ice Cream can be two words or a tasty treat - but it's rare to try to reassign it to no longer mean that sweet melting stuff... while almost the whole purpose of using a pointer is to reassign it. Still, the matter of content vs. container is the heart of this distinction.

Taking up the escape character idea above, note that HTML uses the "&" for escaping things, but does so via macros rather than simple escapes. That is to say, to type that ""&"", I had to type "&", and to type THAT, I had to type "&", ad nauseam. It's just as bad as the mess with asterisks and ampersands that C and C++ provide.

Actually, it looks like you can get away with bare quotation marks in HTML, so I would only have had to expand the ampersand.


¹Yes, that last bit of punctuation was incorrect for English - but it makes sense. And snce they had had different end marks, it was actually kind of important. Sorry for letting that rant leak in here