2011-05-29 6 views
7

Estaba jugando con $NewSymbol tratando de encontrar algo para responder this question con. The docs say that

$ NewSymbol se aplica antes de que realmente se crea el símbolo . Si la acción de $ NewSymbol hace que se cree el símbolo , quizás en un contexto diferente, entonces el símbolo como creado será el utilizado.

así que traté de mover automáticamente un nuevo símbolo en particular en un contexto de prueba que debe evitar que su creación en el contexto Global`*, pero el símbolo se crea en ambos contextos.

In[1]:= Remove["Global`*"] 
In[2]:= $NewSymbol=(Print[#1," : ",#2]; 
        If[#1==="aLongTestSymbolName"&&#2==="Global`", 
         Symbol["TestContext`"<>#1]])&; 

In[3]:= x 
During evaluation of In[3]:= x : Global` 
Out[3]= x 

In[4]:= aLongTestSymbolName 
During evaluation of In[4]:= aLongTestSymbolName : Global` 
During evaluation of In[4]:= aLongTestSymbolName : TestContext` 
Out[4]= aLongTestSymbolName 

In[5]:= Names["Global`*"] 
Out[5]= {aLongTestSymbolName,x} 

In[6]:= Names["TestContext`*"] 
Out[6]= {TestContext`aLongTestSymbolName} 

creo que "aLongTestSymbolName" no debería estar en el contexto Global`. ¿Alguien puede ver lo que he hecho mal o si he malinterpretado la documentación?


Nota: Tener el símbolo creado en ambos contextos no es una opción para el resaltado automático en el anteriormente unido a cuestionar. La idea es reservar ciertos nombres de símbolos como "x"~~___ para variables y "f"~~___ para funciones y luego usar patrones de cadena en $NewSymbol para mover los símbolos al contexto resaltado apropiado.

Respuesta

3

Eso es porque pasaste el nombre del símbolo a Print, que inmediatamente hizo el símbolo en Global`. :-)

O no. Debo probar las cosas antes de responder, pero pensé que sabía esto. Oops.


Me parece ahora que $NewSymbol no intercepta la creación de un símbolo, o si lo hace, cómo hacer uso de esto no es clara.

Si se utiliza:

$NewSymbol = Print["Name: ", #2, #] &; 

a continuación:

In[10]:= aNewSymbol 

During evaluation of In[10]:= Name: Global`aNewSymbol 

Out[10]= aNewSymbol 

Vemos que $NewSymbol no funciona como $PrePrint en que su salida no se convierte en la expresión.

Por lo tanto, si utilizamos:

$NewSymbol = Symbol["TestContext`" <> #] &; 

aSecondSymbol 

aSecondSymbol se crea alegremente en Global` como si nada hubiera cambiado.

Si se puede usar $NewSymbol para dirigir el contexto en el que se crea el símbolo, como lo indica la documentación, no me queda claro cómo hacerlo.

+3

W - En realidad, en su ejemplo 'aSecondSymbol' se crea en' 'Global'' 'y' 'TestContext'' '. ¿Crees que la documentación es incorrecta entonces? Tal vez funcionó en una versión anterior, pero se rompió y nadie se dio cuenta ... Creo que debería preguntarle a WRI. – Simon

+0

@Simon, eso es correcto. Mi punto es que todavía se crea en '' Global' 'aparentemente de forma completamente independiente de todo lo que invoca' $ NewSymbol', y que 'Print' /' If' etc. no están relacionados con el problema. Espero que Michael, Daniel o Sasha se detengan con una respuesta. –

+0

Parece que uno de nuestros empleados locales amigables de WRI se ha detenido, así que envié un informe de error a WRI. – Simon

0

En this Mathematica Journal article acerca de los problemas de contexto es posible que sólo la presencia de un nuevo símbolo en la fase de análisis de la evaluación se sumará a este símbolo para el contexto actual.En este caso, aLongTestSymbolName se entrega a Print y If como # 1 y, por lo tanto, se crea en el contexto actual Global`. No creo que haya nada que puedas hacer en la función $NewSymbol para evitar esto.

El artículo menciona que incluso si utiliza Begin["Context1`"]; someSymbol; End[], someSymbol no se coloca en el contexto Context1` a menos que Begin["Context1`"] se evalúe en una línea separada.

+0

vea la respuesta que acabo de recuperar. Creo que no es correcto, porque el símbolo y los nombres de contexto se pasan como cadenas, de acuerdo con la documentación. –

+0

@ Mr.Wiz hmmm, muy bien. Quizás mma hace algo similar a un ToString [símbolo] antes de pasar? Eso crearía el símbolo. –

+1

Los documentos dicen que $ NewSymbol se evalúa antes de que se cree el símbolo. Me imagino que el nuevo código de símbolo es llamado por 'MakeExpression' cuando encuentra una cadena desconocida. Pero antes de crear el símbolo, ejecuta $ NewSymbol con esa cadena como argumento. – Simon