feat (interpreter): postfix increment operator#9
Conversation
FdelMazo
left a comment
There was a problem hiding this comment.
Muy bueno. Muy interesante que uno puede pasar como syntactic sugar mientras que el otro no (o al menos a mi no se me ocurre como).
Deje unas preguntas, pero esta ok el PR
| right = self.unary() | ||
|
|
||
| # solo se puede aplicar ++ sobre variables. Si no tenemos una variable, es un error | ||
| if not isinstance(right, VariableExpr): |
There was a problem hiding this comment.
Casi seguro que no se puede, porque estarías salteando parte de la gramática, pero sabes si hay manera de acá llamar a self.assignment()?
plox/Interpreter.py
Outdated
| new_value = old_value + 1 | ||
|
|
||
| # asignamos el nuevo valor | ||
| if left in self.local_scope_depths: # si la variable se encuentra en nuestro diccionario de scope local, la asignamos en esa profundidad |
There was a problem hiding this comment.
Creo que quedó un poco verboso hacer dos veces el mismo if. ¿que pensas de directamente hacerlo una vez, y en cambio repetir dos veces el + 1? Es un tema de gusto!
There was a problem hiding this comment.
Ahí agregue este cambio profe, pensé en usar funciones lambda para evitar repetir no solo el +1 sino también evitar repetir dos veces el if para chequear que old_value sea un numero.
Si te parece que queda claro con las funciones lambda lo dejo así, sino puedo cambiarlo. Gracias!
Agregado del operador x++ (continuación)
Resumen
Se agrega como interpretar el operador de post-incremento
++a Plox.Adicionalmente, se agrega el parseo del operador de pre-incremento
++.Cambios realizados
Commit bd27671
Siguiendo con la idea propuesta en el PR anterior, se uso el operator como un syntatic sugar de una suma.
Se parseo el operador como una asignación
x = x + 1para modificar el valor de la variable.Commit f6de721
Comparando como se comportan los operadores de pre-incremento y post-incremento en C
me di cuenta que el comportamiento que tenia el operador como syntactic sugar de una suma era como pre-incremento y no como post-incremento:
Teniendo en cuenta esto, agregue el parseo del operador de pre-incremento
++en la regla productivaunaryparseandolo como una asignaciónx = x + 1:Commit a5892c1
Se agrega la resolución de PostfixExpr al
Resolver.Commit 377d0ec
Se agrego como interpretar expresiones de PostfixExpr al
Interpreter.En la implementación primero nos guardamos en una variable el valor viejo, después asignamos el nuevo valor (sumando 1) y devolvemos el valor viejo.
De esta forma el operador se comporta como post-incremento devolviendo el valor viejo y luego incrementando:
Ejemplos
Adicionalmente se agregaron ejemplos en increment_operator.lox.