2011-04-17 19 views
7

Me gustaría definir un nuevo operador del formulario x /==> y, donde el operador /==> se trata como p. el operador /@ de Map, y se traduce al MyFunction[x, y]. Hay un aspecto importante: Me quiero el operador resultante se comporte en el frontend como cualquiera de los dos bits operador hace, es decir, los dos caracteres (un Divide y una DoubleLongRightArrow) deben conectarse entre sí, sin sintaxis coloración debe aparecen, y deben seleccionarse juntos cuando se haga clic en , por lo que se debe establecer la prioridad. Además, prefiero evitar el uso del paquete Notation`. Como resultado, me gustaría ver algo como esto:Cómo definir/@ - like operator

In[11]:= FullForm[x/\[DoubleLongRightArrow]y] 

Out[11]//FullForm= MyFunction[x,y] 

¿Alguien tiene una idea de cómo lograr esto?

+1

En otras palabras, ¿le gustaría que esto funcione en un kernel independiente, es decir, sin front-end? En este caso, es posible que desee escribir su propio '$ SyntaxHandler', que tomaría una cadena que Mathematica considera que tiene un error de sintaxis. Aunque esto podría ser complicado. – Sasha

+1

¡Hola Istvan! No puedo ayudar con esto, pero déjame darte la bienvenida a StackOverflow. Espero que alguien más aquí tenga una buena respuesta. –

+1

Hola, István, bienvenido a StackOverflow! Un mensaje de bienvenida útil que tomo prestado de belisarius: Permítame darle la bienvenida a StackOverflow y recordarle tres cosas que solemos hacer aquí: 1) A medida que reciba ayuda, trate de responder preguntas también en su área de especialización 2) Lea las preguntas frecuentes 3) Cuando veas buenas preguntas y respuestas, vuélvelas usando los triángulos grises, ya que la credibilidad del sistema se basa en la reputación que obtienen los usuarios al compartir sus conocimientos. Recuerde también aceptar la respuesta que resuelva mejor su problema, si lo hubiera, presionando el signo de marca de verificación –

Respuesta

2

Gracias a los enlaces de Mr.Wizard, he encontrado el único ejemplo en la documentación sobre cómo analizar nuevos operadores (la gplus example in Low-Level Input). De acuerdo con este ejemplo, aquí está mi versión para el nuevo operador PerArrow.Por favor comente/critize en el código de abajo:

In[1]:= PerArrow /: MakeBoxes[PerArrow[x_, y_], StandardForm] := 
    RowBox[{MakeBoxes[x, StandardForm], 
    RowBox[{AdjustmentBox["/", BoxMargins -> -.2], 
     AdjustmentBox["\[DoubleLongRightArrow]", BoxMargins -> -.1]}], 
    MakeBoxes[y, StandardForm]}]; 

MakeExpression[ 
    RowBox[{x_, "/", RowBox[{"\[DoubleLongRightArrow]", y_}]}], 
    StandardForm] := 
    MakeExpression[RowBox[{"PerArrow", "[", x, ",", y, "]"}], 
    StandardForm]; 

In[3]:= PerArrow[x, y] 

Out[3]= x /\[DoubleLongRightArrow] y 

In[4]:= x /\[DoubleLongRightArrow]y 

Out[4]= x /\[DoubleLongRightArrow] y 

In[5]:= FullForm[x /\[DoubleLongRightArrow]y] 

Out[5]//FullForm= \!\(\* 
TagBox[ 
StyleBox[ 
RowBox[{"PerArrow", "[", 
RowBox[{"x", ",", "y"}], "]"}], 
ShowSpecialCharacters->False, 
ShowStringCharacters->True, 
NumberMarks->True], 
FullForm]\) 

En aras de la claridad, aquí es una captura de pantalla, así: new operator

Dado que el operador no está totalmente integrado, además se refiere son:

  • el operador se selecciona raro cuando se hace clic (DoubleLongRightArrow con y en lugar de con /).
  • en consecuencia, la parte de análisis requiere el DoubleLongRightArrow ser RowBox -ed con y, de lo contrario produce error de sintaxis
  • coloración de sintaxis (en In[4] y In[5])
  • imprime raro si introduce directamente (notar la gran lagunas en In[4] y In[5])

Ahora, puedo vivir con estos, sin embargo sería bueno tener algún medio para limar todas las cuestiones de menor importancia. Supongo que todo esto se reduce básicamente a un manejador de sintaxis incluso de nivel inferior, que ahora no sabe cómo agrupar al nuevo operador. ¿Alguna idea sobre cómo abordar estos? Entiendo que Cell tiene una multitud de opciones que pueden ser útiles (como CellEvaluationFunction, ShowAutoStyles y InputAutoReplacements) aunque ahora no tengo ni idea.

+0

Me había olvidado de ShowAutoStyles. Tendré que pensar en cómo se podría usar eso. Todavía sospecho que lo que quieres no es completamente posible, basado en la respuesta que obtuve a mi propia pregunta de Michael Pilat, que trabaja para Wolfram Research. Sin embargo, es posible falsificar uno o más de los puntos de comportamiento adicionales que solicite. –

6

El Notation Package es quizás el más cercano a hacer este tipo de cosas, pero de acuerdo con la respuesta a my own question of a similar nature, desafortunadamente no es práctico lo que quiere.

No dejes que esto te impida probar, ya que probablemente aprendas cosas nuevas en el proceso. El paquete de notación y las funciones que lo sustentan están lejos de ser inútiles.

También puede encontrar respuestas a this question informativo.


Hay una serie de funciones que son útiles para la implementación manual de cambios de sintaxis. En lugar de intentar escribir mi propio archivo de ayuda para estos, lo dirigiré a las páginas oficiales sobre estas funciones. Después de leerlos, haga las preguntas específicas que tenga o solicite ayuda para implementar ideas específicas. Yo u otros aquí debería poder responder a su pregunta, mostrarle cómo hacer algo o explicar por qué no es posible.

hay más, y voy a tratar de extender esta lista más adelante. (otros son bienvenidos a editar este post)

+0

@ István Zachar, específicamente, querrá consultar este 'Notation' [tutorial] (http://reference.wolfram.com/mathematica/Notation/tutorial/NotationSymbolizeAndInfixNotation.html) ya que trata esencialmente de lo que desea hacer, aunque la combinación de los tres operadores puede causarle problemas. – rcollyer

+0

Gracias por los consejos sobre el paquete de notación, pero eso es como una caja negra para mí. Yo tampoco sabría lo que sucede internamente (realmente no quiero realizar una ingeniería inversa) ni podría modificarlo según mis necesidades, ni desarrollarlo más. Es por eso que usaría los básicos básicos de Mathematica, si es posible. Si no, entonces evito usar operadores de múltiples caracteres. –

+0

@ István Zachar, no creo que ni siquiera el paquete de notación haga lo que usted desea, así que no se desanime si no obtiene una respuesta que satisfaga su solicitud. En unos pocos minutos actualizaré mi respuesta con algunas reflexiones adicionales sobre la manipulación manual de la sintaxis. –