La lógica es realmente bastante simple. La “notación sándwich” sería un caso especial de cómo funcionan los operadores. Los casos especiales son malos . Piense en ello como la navaja de Occam para el diseño de lenguaje de programación.
Es un caso especial porque hace que <
no se comporte como un operador normal; de hecho, hace <
perder la localidad del significado .
Normalmente, los operadores trabajan de manera directa: a ⊕ b
toma el resultado de la expresión a
y la expresión b
y los combina con el operador ⊕
para producir otra expresión. Todo lo involucrado es una expresión. Esto hace que la sintaxis del lenguaje de programación sea compositiva : podemos descubrir el significado de una expresión únicamente a partir de los significados de sus sub-expresiones y nada externo.
- ¿Cuál es la correlación entre las matemáticas y la informática? ¿Por qué es necesario?
- ¿Cómo se prueba algo (desde cero) que es NP-hard?
- Cómo crear una ecuación matemática compleja desde cero
- ¿Qué es 7/6 en binario?
- ¿Cuál es un ejemplo de un operador XOR que utiliza conceptos del mundo real?
A su vez, esto simplifica el lenguaje general ya que no necesita un caso especial para cada operador; en cambio, todas son instancias de una sola regla más general. Cuantas menos reglas como esta sean necesarias, más fácil será para un programador tenerlas en mente.
En la mayoría de los idiomas, <
sigue esta regla general. Toma dos expresiones y da como resultado una expresión booleana. Entonces podemos tratar estas expresiones booleanas como cualquier otra expresión y combinarlas de la misma manera usando otros operadores que operan en booleanos como &&
. En (a < b) && (b < c)
, todos los operadores todavía siguen la regla que di anteriormente. Lo mismo sucede en expresiones como a + b + c
, donde el segundo +
combina la expresión a + b
con la expresión c
. Hasta aquí todo bien.
Pero si agregamos la “sintaxis sandwich”, esta regla a veces no funciona para <
! Ahora, la expresión a < b < c
ya no es un resultado directo de sus sub-partes: el doble <
le da a todo un nuevo significado global. Realmente, el doble <
comienza a actuar como su propio operador separado del normal <
porque no podemos considerar los dos operadores <
separado.
Esto, a su vez, hace que el lenguaje sea más complejo para obtener ganancias cuestionables. El objetivo de un lenguaje de programación es proporcionar un conjunto básico de componentes ortogonales para la construcción sistemática de programas, no para reproducir servilmente la notación existente, especialmente cuando la notación en sí misma es a menudo peculiar y arbitraria . En general, me encanta la notación matemática, pero nunca la llamaría coherente y creo que gran parte de la inconsistencia se debe en gran medida a su propio perjuicio.
¿Estás dispuesto a intercambiar simplicidad y elegancia por familiaridad? ¡No soy! Este es un gran ejemplo de la diferencia entre simple y fácil que fue tan bien presentado en la charla de Rich Hickey: Simple Made Easy. (Aunque no estoy de acuerdo con algunos de los detalles de los que habla).
Esta es la misma razón por la que generalmente estoy contento de que los lenguajes de programación no admitan la multiplicación por yuxtaposición y requieran un operador explícito. (¡Bueno, eso y nombres de variables de varios caracteres!)
Esta notación también es confusa en Python porque True < False
es una expresión perfectamente significativa, al igual que 1 + 2
. Pasar de 1 + 2
a 1 + 2 + 3
es sencillo; pasando de True < False
a True < False < True
no lo es! Compare True < False < True
con (True < False) < True
.
Esto también debería decirte que prohibir es la palabra incorrecta . Los lenguajes de programación no “prohíben” esto porque no surge en primer lugar. Más bien, simplemente no se desviven para apoyarlo explícitamente.