2010-11-03 5 views
14

Un question a été publié sur les opérateurs de comparaison chaînés et leur interprétation dans différentes langues.Prise en charge des langages pour les opérateurs de comparaison chaînés (x <y <z)

Les opérateurs de comparaison de chaînage signifient que (x < y < z) serait interprété comme ((x < y) && (y < z)) au lieu de ((x < y) < z).

Les commentaires sur cette question montrent que Python, Perl 6 et Mathematica supportent les opérateurs de comparaison de chaînage, mais quelles autres langues supportent cette fonctionnalité et pourquoi n'est-elle pas plus courante?

Un rapide coup d'oeil à la documentation Python montre que cette fonctionnalité existe depuis au moins 1996. Y a-t-il une raison pour laquelle plus de langues n'ont pas ajouté cette syntaxe?

Un langage typé statiquement aurait des problèmes avec la conversion de type, mais y a-t-il d'autres raisons pour lesquelles ce n'est pas plus commun?

+1

Bonne question. Il me semble que ce serait même rétrocompatible pour Java au moins. (Puisque '<' and '>' ne sont pas définis pour les booléens.) – aioobe

+1

Je pense que ce n'est pas commun parce que les programmeurs sont trop utilisés pour '' <être un opérateur binaire. – CodesInChaos

+0

Pourquoi les langues à typage statique ont-elles des problèmes avec cela? De quelles conversions voulez-vous parler? – sepp2k

Répondre

9

Cela devrait être plus commun, mais je suppose que ce n'est pas parce que cela rend les langages d'analyse plus complexes.

Avantages:

  • CONFIRME le principe de moindre surprise
  • Reads comme les mathématiques est enseigné
  • réduit la charge cognitive (voir 2 points précédents)

Désavantages:

  • La grammaire est plus complexe pour la langue
  • Cas particulier de sucre syntaxique

Quant à savoir pourquoi pas, mes suppositions sont:

  • auteur Langue (s) ne pensent pas
  • est sur le « bon de ont » liste
  • a été décidé qu'il n'y avait pas assez utile pour justifier la mise en œuvre
11

Le bénéfice est trop faible pour justifier de compliquer la langue.

Vous n'en avez pas souvent besoin, et il est facile d'obtenir le même effet proprement avec quelques caractères de plus.

+1

La complexité ajoutée semble être une mauvaise raison. Je ne peux pas penser à une raison pour laquelle la fonctionnalité actuelle serait utile dans un langage dynamiquement typé, alors que cela ajouterait des fonctionnalités supplémentaires sans trop de conflit. Il me semble aussi que c'est plus facile à lire. –

+0

J'ai tendance à être d'accord. Il est soigné un sur un million de fois, mais cela prend beaucoup de tracas à implémenter et à incorporer dans le grammeur. – delnan

+0

@Alan Vous ne devez pas penser de cette façon. Au lieu de cela, vous devez inverser la tendance, que gagnez-vous par rapport au travail nécessaire pour spécifier, documenter, planifier, implémenter et tester? –

1

Je pense que ICON est la langue d'origine pour cela, et dans ICON, il est hors de question que les booléens soient traités comme des balises spéciales 'fail' avec toutes les autres valeurs considérées comme vraies.

3

Scheme (et probablement la plupart des autres langues de la famille Lisp) soutient la comparaison multiple efficacement dans sa grammaire:

(< x y z) 

Cela peut être considéré comme une application de fonction ordinaire de la fonction < avec trois arguments. Voir 6.2.5 Numerical Operations dans la spécification.

Clojure prend également en charge chained comparison.

+0

Fonctionne-t-il avec n arguments? – starblue

+0

@starblue: Oui, autant d'arguments que vous le souhaitez. –

1

Chained co La paraison est une caractéristique de la BCPL depuis la fin des années 1960.

Questions connexes