2008-10-05 10 views
1

Nous connaissons tous les opérateurs pré et post-incrément, par ex.Post-opérateurs combinés?

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 eu souvent besoin d'un 'opérateur post-combiné', qui permettrait:

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

Évidemment, ceci n'est vraiment utile qu'avec des opérateurs non commutables et la signification est modifiée de pré-/post-incrément, même si la syntaxe est empruntée.

Connaissez-vous une langue qui offre un tel opérateur, et pourquoi n'est-il pas plus commun?

Répondre

2

Une objection fondamentale à l'exemple en-donnée est que ce serait créer l'ambiguïté:

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

Edit: Mais non, je ne suis pas au courant de toutes les langues qui les utilisent. Vraisemblablement c'est parce qu'ils ont été omis de C d'où la plupart des autres langages dérivent leurs opérateurs de base.

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

0

Aucun de ceux que je connais, et je ne pense pas qu'il y en aura, puisqu'il s'agit d'une méta-méta-commande. Pour expliquer, les opérateurs d'origine (pour les nombres) provenaient de C où ils étaient directement affectés aux opérations de code machine. Cela a permis au programmeur d'effectuer une optimisation, car le compilateur initial ne l'a pas fait.
Ainsi,

x=x+1; 

et

x+=1; 

et

x++; 

générerait trois sorties assembleur différents.

Maintenant, ajouter + = pour chaîne est une méta-commande. Il ne correspond pas à un opcode, il suit juste et étend le modèle.

2

Les opérateurs 'op =' combinés sont des raccourcis pour var = var op predicate, mais op ne doit pas être quelque chose en particulier. L'opérateur '.' est un raccourci pour une opération "append" dans plusieurs langues, mais rien ne vous empêche de définir une opération "prepend" - ou même de modifier append to prepend - dans n'importe quel langage qui surcharge un opérateur sur n'importe quelle donnée type avec lequel vous voulez travailler (ou sur tout objet que vous pourriez utiliser pour contenir ces données dans le cas contraire). Si vous voulez faire textvar /= newtext sténographie pour textobj = textobj->prepend(newtext) il n'y a rien qui vous arrête. Cela dit, vous ne devriez probablement jamais faire cela, car il n'y a aucun moyen de changer un opérateur existant sans causer beaucoup de confusion. Il est nettement plus facile (et plus clair) de changer votre ordre de déclaration de sorte que vous pouvez aller de gauche à droite, ou utiliser une fonction spécifique telle que unshift pour ajouter des éléments avant toute ambiguïté.

Questions connexes