Pregunta

Todos estamos familiarizados con los operadores pre y post-incremento, por ejemplo,

c++;    // c = c + 1
++c;    // ditto

y los " operadores combinados " que amplían este principio:

c += 5;    // c = c + 5
s .= ", world";    // s = s . ", world"; e.g. PHP

A menudo he necesitado un 'operador post-combinado', que permitiría:

s =. "Hello ";    // s = "Hello " . s

Obviamente, esto solo es realmente útil con operadores que no se pueden conmutar y el significado se altera antes o después del incremento, aunque la sintaxis es prestada.

¿Tiene conocimiento de algún idioma que ofrezca un operador de este tipo y por qué no es más común?

¿Fue útil?

Solución

Una objeción básica al ejemplo dado es que crearía ambigüedad:

a=-5;    //'a = -5' or 'a =- 5'?
b=*p;    //'b = *p' or 'b =* p'?
c=.5;    //'c = .5' or 'c =. 5'?

Editar: Pero no, no conozco ningún idioma que los use. Es de suponer que esto se debe a que se omitieron en C de donde la mayoría de los otros idiomas obtienen sus operadores básicos.

Y sí, me encantaría verlos en los idiomas que utilizo.

Otros consejos

Los operadores

combinados 'op =' son abreviados para var = var op predicate , pero op no tiene que ser nada en particular. El operador '.' es una abreviatura de " append " operación en varios idiomas, pero no hay nada que le impida definir un " antepregar " operación, o incluso cambiar de adjuntar a previo, en cualquier idioma que permita sobrecargar a un operador en cualquier tipo de datos con los que quiera trabajar (o en cualquier objeto que pueda utilizar para contener esos datos). Si quieres hacer que textvar / = newtext sea la abreviatura de textobj = textobj- > prepend (newtext) no hay nada que te detenga.

Dicho esto, probablemente nunca debas hacer esto, ya que no hay manera de cambiar un operador existente sin causar mucha confusión. Es sustancialmente más fácil (y más claro) cambiar su orden de estado de cuenta para que pueda ir de izquierda a derecha, o usar una función específica como unshift para anteponer las cosas sin ninguna ambigüedad.

No conozco ninguno, y no creo que lo haya, ya que es un meta-meta-comando.

Para explicar, los operadores originales (para números) provienen de C, donde se asignaron directamente a las operaciones de código de máquina. Esto permitió al programador realizar la optimización, ya que el compilador anterior no lo hizo.
Entonces,

x=x+1;

y

x+=1;

y

x++;

generaría tres salidas de ensamblador diferentes.

Ahora, agregar + = para cadena es un meta-comando. No se asigna a un código de operación, solo sigue y extiende el patrón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top