Question

Nous connaissons tous les opérateurs pré et post-incrémentation, par exemple

.
c++;    // c = c + 1
++c;    // ditto

et les "opérateurs combinés" qui étendent ce principe:

c += 5;    // c = c + 5
s .= ", world";    // s = s . ", world"; e.g. PHP

J'ai souvent eu besoin d'un "opérateur post-combiné", qui permettrait:

s =. "Hello ";    // s = "Hello " . s

Évidemment, cela n’est vraiment utile que pour les opérateurs non commutables et le sens est modifié avant / après l’incrémentation, même si la syntaxe est empruntée.

Êtes-vous au courant de l'existence d'un langage proposant un tel opérateur, et pourquoi n'est-il pas plus courant?

Était-ce utile?

La solution

Une objection de base à l'exemple fourni est qu'elle créerait une ambiguïté:

a=-5;    //'a = -5' or 'a =- 5'?
b=*p;    //'b = *p' or 'b =* p'?
c=.5;    //'c = .5' or 'c =. 5'?

Modifier: mais non, je ne connais aucune langue qui les utilise. C’est probablement parce qu’ils ont été omis de C, d’où la plupart des autres langues tirent leurs opérateurs de base.

Et oui, j'aimerais beaucoup les voir dans les langues que j'utilise.

Autres conseils

Les opérateurs

combinés 'op =' sont un raccourci pour var = var op prédicat , mais op ne doit pas nécessairement être en particulier. L’opérateur '.' est un raccourci pour un ajout " append " fonctionnement dans un certain nombre de langues, mais rien ne vous empêche de définir un "prépende". operation - ou meme de changer append to prepend - dans n’importe quel langage permettant de surcharger un opérateur sur le type de données avec lequel vous souhaitez travailler (ou sur tout objet que vous pourriez utiliser pour contenir ces données sinon). Si vous voulez utiliser textvar / = newtext pour textobj = textobj- > prepend (newtext) , rien ne vous en empêche.

Cela dit, vous ne devriez probablement jamais faire cela, car il n’ya aucun moyen de changer un opérateur existant sans causer beaucoup de confusion. Il est beaucoup plus facile (et plus clair) de modifier votre ordre de relevé afin que vous puissiez aller de gauche à droite ou utiliser une fonction spécifique telle que annuler le changement pour ajouter des éléments sans ambiguïté.

Aucune que je sache, et je ne pense pas qu'il y en aura une, car c'est une méta-méta-commande.

Pour expliquer, les opérateurs d'origine (pour les nombres) venaient de C où ils étaient directement mappés aux opérations de code machine. Cela a permis au programmeur de faire de l'optimisation, contrairement au compilateur précédent.
Alors,

x=x+1;

et

x+=1;

et

x++;

générerait trois sorties d'assembleur différentes.

Maintenant, ajouter + = for string est une méta-commande. Il ne correspond pas à un opcode, il suit et étend le motif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top