2010-11-03 14 views
14

Un question fue publicada acerca operadores de comparación encadenados y la forma en que se interpretan en diferentes idiomas.soporte de idioma para los operadores de comparación encadenados (x <y <z)

Encadenar operadores de comparación significa que (x < y < z) se interpretaría como ((x < y) && (y < z)) en lugar de ((x < y) < z).

Los comentarios sobre esta pregunta muestran que Python, Perl 6, y Mathematica apoyo de encadenamiento de los operadores de comparación, pero ¿qué otros idiomas compatibles con esta función y por qué no es lo más común?

Un rápido vistazo a la documentación de Python muestra que esta característica ha sido por lo menos desde 1996. ¿Hay una razón más idiomas no han añadido esta sintaxis?

Un lenguaje de tipos estáticos tendría problemas con la conversión de tipos, pero ¿Hay otras razones esto no es más común?

+1

Buena pregunta. Me parece que incluso sería compatible con versiones anteriores de Java al menos. (Dado que '<' and '>' no están definidos para booleanos.) – aioobe

+1

Creo que no es común porque los programadores están demasiado acostumbrados a '<' ser un operador binario. – CodesInChaos

+0

¿Por qué los lenguajes tipados estáticamente tienen problemas con esto? ¿A qué tipo de conversiones te refieres? – sepp2k

Respuesta

9

Debería ser más común, pero sospecho que no lo es porque hace que los lenguajes de análisis sean más complejos.

Beneficios:

  • sostiene el principio de la menor sorpresa
  • lee como matemáticas se enseña
  • Reduce la carga cognitiva (ver 2 puntos anteriores)

Inconvenientes:

  • La gramática es más compleja para el idioma
  • caso especial de azúcar sintáctica

En cuanto a por qué no, mis conjeturas son:

  • autor (s) idioma no pensó que
  • está en el 'bueno tienen' lista
  • se decidió que no era lo suficientemente útil para justificar la aplicación de
11

El beneficio es demasiado pequeño para justificar la complicación del idioma.

Usted no lo necesita, que a menudo, y es fácil de conseguir el mismo efecto limpiamente con unos pocos caracteres más.

+1

La complejidad añadida parece una razón pobre. No puedo pensar en una razón por la que la funcionalidad actual sea útil en un lenguaje de tipado dinámico, mientras que esto agregaría funcionalidad extra sin mucho conflicto. También me parece que es más fácil de leer. –

+0

Tiendo a estar de acuerdo. Es perfecto uno en un millón de veces, pero sin duda lleva un montón de complicaciones implementarlo e incorporarlo a la gramática. – delnan

+0

@ Alan No debe pensar de esa manera. En su lugar, tiene que darle la vuelta, ¿qué gana, en comparación con el trabajo necesario para especificarlo, documentarlo, planificarlo, implementarlo y probarlo? –

1

creo ICON es el idioma original para tener esto, y en ICONO que se cae de la forma en que se manejan como booleanos especial 'fallar' etiquetas con todos los demás valores están siendo tratados como verdadero.

3

Esquema (y probablemente la mayoría de las otras lenguas de la familia Lisp) apoya comparación múltiple de manera eficiente dentro de su gramática:

(< x y z) 

Esto se puede considerar una solicitud función ordinaria de la función < con tres argumentos. Ver 6.2.5 Numerical Operations en la especificación.

Clojure apoya chained comparison también.

+0

¿Funciona con n argumentos? – starblue

+0

@starblue: Sí, todos los argumentos que desee. –

1

co encadenada mparison es una característica de BCPL, desde finales de 1960.

Cuestiones relacionadas