50 votes

La préséance des opérateurs en Scala

J'aime bien la proposition de Scala concernant la préséance des opérateurs, mais dans certains cas rares, les règles non modifiées peuvent être gênantes, parce que vous avez des restrictions dans le nommage de vos méthodes. Existe-t-il des moyens de définir d'autres règles pour une classe/un fichier, etc. en Scala ? Si ce n'est pas le cas, cela sera-t-il résolu à l'avenir ?

3 votes

Sujet connexe de la liste de diffusion : scala-programming-language.1934581.n4.nabble.com/

104voto

Thomas Jung Points 17692

La préséance des opérateurs est fixée dans le Référence Scala - 6.12.3 Opérations infixes par le premier caractère de l'opérateur. Ils sont énumérés par ordre croissant de priorité :

(all letters)
|
^
&
= !
< >
:
+ -
* / %
(all other special characters)

Et il est peu probable que cela change. Il créera probablement plus de problèmes qu'il n'en résoudra. Si vous êtes habitué à la préséance normale des opérateurs, la modifier pour une classe sera assez déroutant.

6 votes

@huynhjl à partir de la référence citée : "Il y a une exception à cette règle, qui concerne les opérateurs d'affectation (§6.12.4). La préséance d'un opérateur d'affectation est la même que celle de l'affectation simple (=). C'est-à-dire qu'elle est inférieure à celle de tout autre opérateur". Le §6.12.4 décrit un opérateur d'affectation comme un opérateur se terminant par "=". La liste ci-dessus est donc incomplète, plutôt qu'incorrecte.

7 votes

@Luigi Plinge, === n'est pas un opérateur d'affectation car il y a une exception : un opérateur se terminant par = est un opérateur d'affectation sauf si l'opérateur commence également par un caractère égal . Regardez le fil de discussion de Gmane et l'autre lien, Martin lui-même a indiqué que le SLS avait besoin d'une mise à jour. Je ne vois pas encore de mise à jour.

1 votes

Je pense que la décision de faire (all letters) le "plus faible" est bizarre : a contains b || c contains d qui, je pense, est une construction fréquente, a besoin de parenthèses...

8voto

Randall Schulz Points 18820

Existe-t-il des moyens de définir d'autres règles pour une classe/un fichier, etc. en Scala ? Si ce n'est pas le cas, cela pourrait-il être résolu à l'avenir ?

Cette possibilité n'existe pas et il est peu probable qu'elle soit ajoutée dans un avenir proche.

2voto

Luciano Points 184

Il y avait un demande de fonctionnalité soulevée dans le cadre de la fourche de niveau de type du compilateur scala une version du compilateur qui présente des fonctionnalités expérimentales en avant-première. Les développeurs ont suggéré que si quelqu'un devait écrire un SIP pour cela, il peut être envisagé de le mettre en œuvre.

Mais dans l'état actuel des choses, il n'y a aucun moyen d'outrepasser la préséance. Ses règles sont formellement définies dans le document spécification de la langue .

2voto

Erik Allik Points 9158

Je n'ai pas essayé moi-même, mais je suppose que les macros de Scala peuvent vous aider à définir une préséance personnalisée dans certains contextes, ce qui vous permettrait de faire quelque chose comme ça :

myDsl {
  <expressions with custom precedence>
}

Cela signifie que le myDsl devrait injecter des parenthèses dans l'AST.

0voto

Fuad Efendi Points 99

les règles non modifiées peuvent être gênantes, parce que vous avez des restrictions dans la dénomination de vos méthodes

  • vous n'avez aucune restriction quant à la dénomination de vos méthodes. Par exemple, vous pouvez définir des méthodes +, -, *, etc. pour une classe.
  • nous devons également suivre les "règles non modifiées" de facto (appliquées par les règles de préséance des opérateurs Scala) mentionnées dans la réponse précédente ( https://stackoverflow.com/a/2922456 ) de Thomas Jung - elle est commune à de nombreux langages de programmation, voire à tous, et à l'algèbre abstraite ; il n'est pas nécessaire de redéfinir la préséance des opérateurs pour a+b*c.

Voir le chapitre 6 du livre http://www.scala-lang.org/docu/files/ScalaByExample.pdf pour l'exemple de la classe "Rational".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X