Los operadores prefijos e infijos no pueden ser a la vez identificadores
Si ese fuera el caso, tendríamos la siguiente ambigüedad.
a b c //=> (a) b (c) si b fuera infijo
a b c //=> a (b c) si b fuera prefijo
Una solución a esto es restringir o bien los operadores infijos o bien los prefijos para que no puedan ser identificadores.
Las palabras clave de las sentencias no pueden ser identificadores
Parece una perogrullada, pero hay una razón para que sea así.
return + a //=> return (+a) si es palabra clave
return + a //=> (return) + (a) si es identificador
Una solución a esto es reservar ciertos identificadores como palabras clave. Otra solución es marcar de alguna manera los identificadores que queramos que sean introductores de sentencias.
La tensión entre la llamada por yuxtaposición y los operadores como identificadores
No pueden compartir la misma categoría sintáctica (identificadores) ya que su asociatividad es distinta.
a b c //=> (a b) c si es llamada por yuxtaposición (currificación)
a b c //=> a (b c) si b es un operador prefijo
a b c //=> (a) b (c) si b es un operadores infijo
Una solución es no tener llamada por yuxtaposición. Otra solución es restringir los operadores a símbolos.
+ - c //=> + (- c) OK. No se confunde. Si son símbolos, son prefijos.
Un operador no puede ser infijo, prefijo y postfijo a la vez
Si ese fuera el caso, tenemos la siguiente ambigüedad. Incluso con una categoría sintáctica distinta.
a + + b //=> (a +) + b si el primer más es tomado como postfijo
a + + b //=> a + (+ b) si el segundo más es tomado como prefijo
Llamada por yuxtaposición y tuplas son incompatibles con la sintaxis usual de llamada
Esto sólo es relevante si la semántica es distinta. Si la semántica es la misma, la ambigüedad confluye en un mismo significado.
f(a,b,c) //=> La función f aplicada por yuxtaposición a un argumento que es la tupla (a,b,c)
f(a,b,c) //=> La función f aplicada a tres argumentos que son a, b y c
Una solución a esto es usar otra sintaxis para las tuplas, por ejemplo [a,b,c].
Tuplas y parentización
Es una ambigüedad muy usual.
(1) //=> El número uno
(1) //=> Una tupla con un elemento que es el número uno
Algunos lenguajes como Python solucionan esto añadiendo una coma extra en el caso de ser una tupla y no una parentización.
(1,) //=> Una tupla en Python
jueves, 15 de septiembre de 2011
Suscribirse a:
Enviar comentarios (Atom)
0 comentarios:
Publicar un comentario