2016-08-02 11 views
0

Ich unterrichtete einen Freund über Programmierung und es fiel mir schwer sie davon zu überzeugen, dass a = b und b = a zwei sehr unterschiedliche Dinge sind.Beispiel einer Programmiersprache, die assoziativ bleibt?

Ich fand schließlich die richtigen Worte, um es zu beschreiben (right associative), die mich denken ließen.

Gibt es Programmiersprachen, die assoziativ bleiben? Ich habe noch nie eine Sprache gesehen wo:

a = b Ergebnisse in b wird auf den Wert von a gesetzt.

+2

Ich denke, dass Ihre Frage irreführend ist. Sie fragen nach Zuordnung Assoziativität, aber vermarkten Sie Ihre Frage als Sprache Assoziativität, was auch immer das bedeutet (ich glaube, es bedeutet nichts.) –

+0

@LittleAlien wie würden Sie die Frage klären? Von dem, was ich gesehen habe, sind alle Operatoren in jeder Sprache rechts assoziativ eingestellt. Ich dachte, es könnte eine Sprache geben, die geschrieben wurde, um assoziativ zu bleiben. –

+1

Es ist nicht schwer herauszufinden, dass es Operationen gibt, die nicht richtig assoziativ sind. Sogar unter dem Link, den Sie gepostet haben, lesen wir über nicht assoziative Operatoren und sehen einen Link zur C-Sprachen-Op-Präzedenztabelle mit Assoziativität. Dort finden Sie links und rechts assoziative Operatoren. Sie werden keine "richtige assoziative Sprache" in Google finden. Sie haben [nur einen Operator ausgewählt und seine Assoziativität auf alle Operatoren erweitert] (http://www.youtube.com/watch?v=s7MTM4BKZ_E). Da es keine RA-Sprachen gibt, habe ich gedacht, dass Sie nach dem LA-Zuweisungs-Operator fragen. –

Antwort

0

Wenn wir über Operator associativity reden sollten wir darüber nachdenken eigentlich zwei Arten von associativity: side_associative (zB =) oder non-associative (zB ==), da es keinen Unterschied für eine Maschine macht, wenn er die Linie links bekommen ist aus nach rechts oder von rechts nach links.

Es gibt keine solchen Programmiersprachen, die ursprünglich left associative sind aber einige von ihnen lassen Sie es über Überladen von Operatoren und einige (zum Beispiel R) werden beide erlauben: -> und <-.

Ich glaube, niemand wird es in Europa mögen, aber es könnte schön im Nahen Osten gefunden werden. Ich kann mir vorstellen, dass es IDE s gibt, die rechts mit der linken Seite wechseln, aber am Ende werden Compiler auf eine europäische Art geschrieben.

+0

"Nicht assoziativ" bedeutet definitiv nicht, dass es egal ist, ob es von rechts oder von links gelesen wird. Abhängig vom Kontext kann es entweder bedeuten, dass der Operator nicht die assoziative Eigenschaft hat (dh '(a op b) op c 'ist nicht äquivalent zu' a op (b op c) ') (wie hier verwendet [https: //en.wikipedia.org/wiki/Associative_property#Non-associativity)) oder dass es weder links- noch rechtsassoziativ ist (dh mehrfache Verwendungen des Operators müssen immer in Klammern gesetzt werden) - wie hier verwendet [https://en.wikipedia.org/wiki/Operator_associativity#Non-associative_operators). – sepp2k

2

Ich glaube nicht. Obwohl Sie den Zuweisungsoperator immer überladen können und in Ihrem C++ vollständige Verwirrung verursachen können.

1

R hat sowohl <- als auch -> Zuweisungsoperatoren definiert.

> b <- 42 
> b -> a 
> a 
[1] 42 
4

Sie missverstanden Assoziativität. Ein Operator op ist assoziativ, wenn (a op b) op c äquivalent zu a op (b op c) ist. Für Operatoren, die nicht assoziativ sind, wird es daher relevant, ob a op b op c für die erstere oder die letztere steht. Wir unterscheiden also zwischen linksassoziativen Operatoren, wo es (a op b) op c ist, und rechtsassoziativen Operatoren, wo es a op (b op c) ist.

Die meisten Operatoren in den meisten Sprachen sind linksassoziativ. Nehmen Sie zum Beispiel -: a - b - c entspricht (a - b) - c in den meisten Sprachen, nicht a - (b - c).

Der Zuweisungsoperator ist eine Ausnahme davon, da (a = b) = c im Allgemeinen nicht legal ist (wie Sie dem Ergebnis einer Zuweisung nicht zuweisen können). Somit entspricht a = b = c in den meisten Sprachen a = (b = c). Eine bemerkenswerte Ausnahme ist Python, wo a = b = c überhaupt nicht assoziiert und ist einfach illegal.

Das hat nichts mit dem Unterschied zwischen a = b und b = a zu tun. Da dies nur eine einzige Verwendung des Operators = erfordert, wird die Assoziativität nicht berücksichtigt. Vielmehr ist die relevante Eigenschaft : Ein Operator op ist kommutativ, wenn a op b äquivalent zu b op a ist. Mir ist keine Sprache bekannt, in der der Einsatz kommutativ ist, und ich habe auch keine Vorstellung davon, wie es sein könnte.

Konzepte wie Links-Kommutativität oder Rechts-Kommutativität gibt es nicht. Soweit ich weiß, gibt es keine Bezeichnung für die Frage "Verteilt a = bb bis a oder umgekehrt?" - Das ist nur ein Teil der Semantik des Zuweisungsoperators.

Verwandte Themen