¿Qué tan útiles son los operadores infix en un lenguaje de programación?

13

¿Qué tan útiles son los operadores infix en un lenguaje de programación? ¿Merecen la complejidad adicional que proporcionan? ¿Puede proporcionar algún ejemplo en el que los operadores infijos se adapten mejor al problema que no se puede manejar simplemente sobrecargando a los operadores normales?

Casebash
fuente
55
Debes ser un Lisper. Estoy en lo cierto?
missingfaktor
@missingfaktor: Apenas lo
usé
1
¿Cómo se relacionan los operadores infijos con la sobrecarga del operador?
Rein Henrichs
3
Vale la pena señalar que la mayoría de los lenguajes OO (ish) populares usan infijo para los nombres de los métodos. De hecho, algunos lenguajes tienen cierta extensión para permitir que los métodos "estáticos" se escriban como, digamos, en arg1.method(arg2)lugar de method(arg1, arg2).
Tom Hawtin - tackline

Respuestas:

16

Creo que los operadores infijos provienen de las matemáticas.

Esta:

2 + 3 * 4

es más legible para la mayoría de las personas, que

(+ 2 (* 3 4))

porque la mayoría de las personas están familiarizadas con las matemáticas.

Lo suficientemente interesante en Haskell puede saltar entre infijo y prefijo. Esto está usando la misma función "(+)":

(+) 1 2
1 + 2

y esto está usando la misma función "elem":

elem 42 [1,2,42]
42 `elem` [1,2,42]
LennyProgrammers
fuente
La sobrecarga de los operadores normales maneja la mayoría de los casos de esto
Casebash
1
@Casebash: esos operadores "normales" a veces también tienen infijo.
liori
2
Debo ser raro, porque me parece (+ 1 2) mucho más legible que 1 + 2. Por lo menos (+ 1 2 3 4 5)es mejor que 1 + 2 + 3 + 4 + 5.
Joe D
También hay RPN: empuje los elementos, luego el operador.
PhiLho
@PhiLho ¡También llamados operadores de postfix! Así: 1 2 +o 1 2 3 4 5 +más típicamente para el último caso 1 2 + 3 + 4 + 5 +. En realidad, hay una ventaja ingeniosa para aquellos en que modela perfectamente un sistema basado en pila y rara vez (¿alguna vez?) Necesita paréntesis para ajustar la precedencia del operador.
CodexArcanum
6

Los lenguajes de computadora están diseñados para humanos, no para máquinas. Y los humanos están más acostumbrados a infijar operadores que pre o postfixes.

Gulshan
fuente
6

La única razón real para los operadores de infijo es que los humanos generalmente los encuentran más fáciles de leer. Esto se debe en gran parte a dos hechos:

  • Aprendemos operadores infijos en forma de matemáticas desde una edad temprana y, por lo tanto, estamos familiarizados con ellos: 2 * 2 = 4etc.
  • Un operador infijo tiene la ventaja de separar "visualmente" dos argumentos. p.ej(some complex expression) + (some other complex expression)

Desde una perspectiva lógica / máquina, los operadores infijos realmente no agregan ningún valor y en algunos casos son una molestia:

  • Siempre puede convertir de infijo a una llamada de función equivalente con dos argumentos, por lo que los operadores de infijo nunca son más que "azúcar sintáctico"
  • Infix puede ser inconveniente cuando desea utilizar más de dos parámetros. (* 1 2 3 4 5)en Lisp, por ejemplo, se podría decir que es una sintaxis mucho más limpia para multiplicar un conjunto de números.
  • Desde una perspectiva de análisis, a menudo es útil leer primero el operador para saber cómo interpretar el resto de la expresión. Con los operadores de infijo, esto puede ser mucho más complejo (por ejemplo, debe mantener una pila o algo similar para determinar qué operador se aplica a qué argumentos)
  • En lenguajes basados ​​en pila / concatenantes como Forth, desea que el operador sea empujado en la pila al final, de modo que ya tenga sus argumentos en la posición correcta. Nuevamente, enterrar al operador en medio de una secuencia de tokens solo complica las cosas.
  • Los operadores de Infix pueden volverse muy confusos cuando están sobrecargados. ¿Qué significa "+" cuando se aplica a dos HashMaps, por ejemplo? Aquí, la comprensión humana intuitiva del operador infijo funciona en su contra porque es fácil asumir un significado que en realidad no fue pensado .....
mikera
fuente
Creo que el último argumento es falso. Depende del programador usar nombres sensibles para las funciones, ya sea usando símbolos o letras.
Tom Hawtin - tackline
@Tom: claro, los programadores deben elegir nombres razonables. Pero uno de los criterios clave para "sensible" es "¿pueden otras personas entenderlo intuitivamente?" - He visto muchos casos con sobrecarga del operador donde esto está lejos del caso. No quiero tener que aplicar ingeniería inversa a la extraña definición de alguien de lo que significa ">> =" cuando se aplica a algún tipo de datos arbitrario. Nombres de funciones adecuados por favor!
mikera