uqbar-project / wollok

Wollok Programming Language
GNU General Public License v3.0
60 stars 16 forks source link

Sumas entre numeros y strings da error segun el orden en que se evalúe #1202

Open lspigariol opened 7 years ago

lspigariol commented 7 years ago

Es al menos extraño el comportamiento del metodo + "pin" + "ocho" "pinocho"

"ben" + 10 "ben10"

10 + "ben" error

10 + 8 18

calculo que que para el TS tambien es un problema...

matifreyre commented 7 years ago

Por lo que veo, es consistente en cuanto a que toma el tipo resultante de acuerdo al receptor del mensaje ya que opera convirtiendo al parámetro al tipo propio, siempre que sea posible.

On Tue, Aug 8, 2017 at 2:53 PM, Lucas Spigariol notifications@github.com wrote:

Es al menos extraño el comportamiento del metodo + "pin" + "ocho" "pinocho"

"ben" + 10 "ben10"

10 + "ben" error

10 + 8 18

calculo que que para el TS tambien es un problema...

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/uqbar-project/wollok/issues/1202, or mute the thread https://github.com/notifications/unsubscribe-auth/AJ-EZpSEX_vVLyF4fsk8mkkFPBAh9TA7ks5sWKCegaJpZM4OxE3n .

npasserini commented 7 years ago

Los casos con el mismo tipo están claros. La pregunta es qué hacer en los casos con tipos mixtos.

Si bien es cierto que siendo objetos podría ser "esperable" que el comportamiento depende del receptor, dado que la semántica habitual que se le da al símolo "+" asume la propiedad conmutativa, creo que sería más prolijo y más intuitivo para el usuario que el comportamiento de los objetos del lenguaje al recibir el mensaje "+" respete esta propiedad.

Por otro lado, ¡la "suma" de strings (=concatenación) de Strings no es una operación conmutativa! Es decir, nadie esperaría que "hola" + "mundo" == "mundo" + "hola". Así que tenemos que ser cuidadosos en la definición.

Dadas estas condiciones, podríamos pensar que la estrategia más sencilla para llegar a algo relativamente consistente es que la operación con tipos mixtos termine siempre en error.

Lo voy a marcar como discusión para que definamos el comportamiento esperado. Entiendo que una vez definido eso la implementación es sencilla.

lspigariol commented 7 years ago

Tambien recordemos otros casos del +

Concatena colecciones (Set y Bag) y devuelve colección del tipo del receptor. En los strings, se le puede pasar como argumento no solo un nro, sino un booleano, un wko y cualquier cosa, que lo convierte en string y concatena. El + entre Enteros y Reales, convierte a Reales, independientemente de quien sea el receptor

Por otra parte, para hacer que 1 + "hola" sea "1hola", se lo puede trampear fácil haciendo "" + 1 + "hola"

Pensando en soluciones, otra alternativa es que Que en las operaciones mixtas entre numeros (y otros literales) y strings siempre convierta a String.

Pero también me preguntaba... ¿cual es el sentido que sea polimorfico el +? ¿Es un quilombo de compatibilidad implementar un ++ para concatenar? Se me ocurre que dejar el + solo para números simplifica el TS

javierfernandes commented 7 years ago

Yo siempre tuve en el tintero implementar string interpolartion. Todo lenguaje "moderno" las tiene y suelen ser bastante mas practicas que concatenar. No soluciona el problema, pero reduce usos

Creo que estamos ante un conflicto cultural. En la mayoria de los lenguajes los strings se concatenan con el + entonces nos parece "natural" ( y es comodo que sea un simbolo). Pero no tiene nada que ver con la suma numerica, como explicó nico

Asi que, suena medio raro peor tal vez con interpolations y un simbolo distinto para el "concat" creo que seria concrptualmente mas asertado. Incluso esa concatenacion podria si ser compartida entre strings y listas. Ya que en ambas pasa eso de la no conmutabilidad

"Hola" :: "mundo" ?

Seria bueno pensarlo anticipando como seria un destructuring de listas (o pattern matching, como quieran)

const [ local :: visitante ] = partido

No es necesario obvio, pero bueno.

El El jue, 10 de ago. de 2017 a las 19:56, Lucas Spigariol < notifications@github.com> escribió:

Tambien recordemos otros casos del +

Concatena colecciones (Set y Bag) y devuelve colección del tipo del receptor. En los strings, se le puede pasar como argumento no solo un nro, sino un booleano, un wko y cualquier cosa, que lo convierte en string y concatena. El + entre Enteros y Reales, convierte a Reales, independientemente de quien sea el receptor

Por otra parte, para hacer que 1 + "hola" sea "1hola", se lo puede trampear fácil haciendo "" + 1 + "hola"

Pensando en soluciones, otra alternativa es que Que en las operaciones mixtas entre numeros (y otros literales) y strings siempre convierta a String.

Pero también me preguntaba... ¿cual es el sentido que sea polimorfico el +? ¿Es un quilombo de compatibilidad implementar un ++ para concatenar? Se me ocurre que dejar el + solo para números simplifica el TS

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/uqbar-project/wollok/issues/1202#issuecomment-321695276, or mute the thread https://github.com/notifications/unsubscribe-auth/AEORWDEPKj1cI6KIDZ1u3879kgd32c64ks5sW4qagaJpZM4OxE3n .