uqbar-project/wollok-language

toString vs kindName vs printString vs className vs shortDescription

Open

#140 opened on Jun 29, 2022

View on GitHub
 (5 comments) (0 reactions) (0 assignees)Wollok (14 forks)auto 404
help wanted

Repository metrics

Stars
 (8 stars)
PR merge metrics
 (PR metrics pending)

Description

Viene de acá.

Todos estos métodos están dando vuelta de alguna forma ú otra en Wollok, y todos toman un objeto y devuelven un string con alguna representación del objeto receptor

toString()

wollok-language

// class Object
/**
   * String representation of Wollok object
   */
  method toString() = self.kindName()
  • Tiene algunas redefiniciones nativas (number, string, etc.) y otras no (collection, date).
  • Se usa en lugares varios, como para calcular la cantidad de dígitos de un número o elegir qué mostrar en un doesNotUnderstand o imprimir un stack trace. También es el método por defecto para imprimir en consola

image image

wollok-xtext y wollok-ts-cli

image image

printString()

wollok-language

  // class Object
  /**
   * Provides a visual representation of Wollok Object
   * By default, same as toString but can be overridden
   * like in String
   */
  method printString() = self.toString()
  • en lugares como String redefine agregando dobles comillas (para que en la consola un String se vea con dobles comillas). ¡pero este mensaje no es usado por el CLI! (ver abajo problemas).
  • Uso: Al definir los mensajes de los asserts, y para el toString de las colecciones (WTF)

wollok-xtext

image

wollok-ts-cli

image

shortDescription()

wollok-language

  // class Object
  /**
   * Shows a short, internal representation
   */
  method shortDescription() = self.toString()

Pero en Date es nativo:

  // class Date
  /** String representation of a date */
  override method toString() = self.shortDescription()
   /**
   * Shows a short, internal representation of a date
   * (the result varies depending on user's locale)
   *
   * Example:
   *     new Date(day = 2, month = 4, year = 2018).shortDescription()
   *         ==> Answers 2/4/2018
   */
  override method shortDescription() native

  • Parece que se usa para mostrar el diagrama de objetos en Wollok XText (si no entendí mal)

wollok-xtext y wollok-ts

image Para todos los objetos es igual que el toString, acá vemos la diferencia de implementación de natives.

kindName()

wollok-language

  // class Object
    /** Object description in english/spanish/... (depending on i18n configuration)
   *
   * Examples:
   *     "2".kindName()  => Answers "a String"
   *    2.kindName()    => Answers "a Integer"
   *
   * @private
   */
  method kindName() native
  • En wollok-language está implementado como un native, y se usa para "zafar" al imprimir un does not undersand si JUSTO lo que no anda es el toString.

wollok-xtext y wollok-ts

image

  • En WollokTS es el fully qualified name, es diferente a Wollok XText. NicoS opina que es más claro que sea el fqn.

className()

wollok-language

  • Sólo se usa para las excepciones dentro de wollok-language (para compararlas e imprimir el stack trace)

wollok-xtext y wollok-ts-cli

  • className es de hecho el único método de todos estos que es igual en ambos lenguajes host image

Problemas:

  • El principal problema por el que estamos haciendo esto es que al escribir pepita escupe src.arch1.pepita y al escribir new Golondrina() nos devuelve src.arch1.Golondrina. Nos gustaría llegar a que escupa pepita también, y un/a Golondrina.
  • No se entiende la diferencia entre printString y toString, teniendo en cuenta que ningún CLI, ni el de Eclipse ni el de TS, lo usan para mostrar objetos en consola. printString se usa en lugares medio "pobres".
  • En Wollok-TS la definición nativa de String>>toString difiere de WollokXText. Entonces, lo que se muestra en la pantalla al apretar "enter" si puse un string, no tiene comillas:

image

  • Es molesto que existan métodos en el lenguaje como kindName o className que abren la puerta a preguntar por la clase en lugar de usar polimorfismo. PERO alguno de los dos es necesario, especialmente para poder escribir en un lugar genérico cómo se imprime un stacktrace (para lo cual necesito el nombre de la clase ú objeto) o para comparar excepciones en los tests.
  • Hasta que no me metí en WollokXText no entendí para qué se usaba shortDescription o cuál era la diferencia con los otros.
  • Las dos implementaciones nativas de shortDescription (y por lo tanto de toString) hacen cosas distintas para Date, y a fin de cuentas no hay una verdadera diferencia entre shortDescription y toString.

Posible solución

Propongo cambiar el lenguaje (wollok-language) de la siguiente forma:

  • En ese último sentido, podríamos dejar el method toString() = self.kindName() pero podemos hacer un method printString() native que se encargue de hacer que para un WKO diga su nombre, para un objeto no nombrado diga "un Objeto", y para el resto diga "un/a NombreDeClase".
  • Que printString sea lo que se espera en consola para imprimir objetos retornados, que es el redefinible. No sé en qué lugares ameritaría además reemplazar toString por printString. Tunearía las documentaciones de ambos métodos para saber cuál usar y cuál redefinir en cada caso. En particular, me gusta la idea de que "toString" tenga la semántica "convertir a string" y que "printString" tenga la semántica "mostrale a une humane este objeto".
  • Borrar toda referencia a className. Que en todos los lugares donde se use className se reemplace por kindName. (me gusta más "kindName" para el nombre de un método que me dice tu identificador estático, porque podés no tener una clase, como en el caso de un WKO o un objeto no nombrado).
  • ¿Agregar quizás una validación con warning de no usar kindName? Que diga lo mismo que la de igualar por objeto: "quizás querés usar polimorfismo".
  • Borrar toda referencia a shortDescription (prefiero) o bien que la documentación de shortDescription agregue algo como "e.g. for small places like object diagrams" (Y que el worksheet de wollok-run-client envíe ese mensaje para mostrar su diagrama).
  • De hecho la implementación actual de printString de collection parece ser más adecuada para una shortDescription, y de hecho usa kindName, ojo si decidimos volarlo en lugar de className.
  • La forma de imprimir un Date podría usar formato ISO (YYYY-MM-DD) (cambiar el contrato de su toString) para no tener quilombos de locale.

Contributor guide