Consejos para trabajar con Unison en local a través de la CLI de Exercism
Escribes código de Unison en ficheros con la extensión .u. Los llamamos ficheros «scratch» porque los usas para escribir código de Unison, pero es el Unison Codebase Manager (UCM) quien en última instancia almacena y guarda el contenido de esos ficheros. Seguirás enviando estos ficheros a través de la CLI de Exercism, pero el UCM puede considerarse la «fuente de la verdad» del código de Unison.
Aunque Unison no tiene un REPL (bucle de lectura, evaluación e impresión), puedes evaluar expresiones de Unison rápidamente con las «watch expressions». En tu fichero con extensión .u, empieza una línea con > y escribe una expresión a la derecha.
> myFunction 42 "hi"
El UCM mostrará los resultados de evaluar la expresión al guardar el fichero. Esto puede resultarte útil para solucionar problemas con la implementación de tus ejercicios.
Para conocer con más detalle el flujo de trabajo en Exercism, aquí tienes un vídeo de demostración sobre cómo implementar y probar un ejercicio de Exercism.
El vídeo de demostración muestra el flujo de trabajo de una versión anterior de Unison. Consulta el nuevo flujo de trabajo aquí con el nuevo flujo de trabajo de proyectos.
Un código base de Unison se organiza por «espacios de nombres». Los espacios de nombres funcionan de forma parecida a los directorios de un sistema de ficheros, salvo que en lugar de contener ficheros, contienen tus tipos y funciones de Unison. Las rutas de los espacios de nombres se separan con puntos, .. Por ejemplo, podemos referirnos al espacio de nombres Text dentro del espacio de nombres base con base.Text.
Te recomendamos que crees un espacio de nombres para cada ejercicio que vayas completando, o que entres en él con cd.
La sintaxis de Unison para gestionar y especificar importaciones es la sintaxis use. Por ejemplo, use base.data.List traería al scope todas las funciones del espacio de nombres base.data.List. Esto puede ser útil cuando usas una función como map sobre una List que hay que distinguir de otras funciones map, como Optional.map. También puedes importar funciones concretas escribiendo después del espacio de nombres una lista de funciones separadas por espacios que quieras traer al scope, como en: use base.data.List tails head flatMap.
Puedes usar la sintaxis use tanto en el nivel superior de un fichero como dentro de las funciones para especificar importaciones. Las cláusulas use respetan las reglas del scope léxico, así que las importaciones más anidadas tienen prioridad sobre las menos anidadas.
La biblioteca estándar de Unison se llama base. De forma predeterminada, se descarga en los nuevos códigos base de Unison. Puedes explorar las funciones disponibles para tus implementaciones a través del repositorio en línea de código de Unison, Unison share, o mediante la interfaz local del código base, o buscando en el Unison Codebase Manager (UCM). Eso lo describimos a continuación.
Puedes ver una lista completa de los comandos del UCM escribiendo help en el UCM, pero aquí tienes algunos consejos y convenciones.
Puedes buscar términos por nombre o por prefijo de espacio de nombres en el UCM con el comando find, pero find también admite búsquedas en el código base basadas en el tipo. Para buscar una función por su firma de tipo, escribe find seguido de un espacio y dos puntos, por ejemplo find : [a] -> [[a]].
Puedes listar el contenido de un espacio de nombres con el comando ls, por ejemplo ls base.data.List o ls .exercism.helloWorld. Muchos de los comandos del UCM aceptan tanto rutas de espacio de nombres relativas como argumentos de espacio de nombres totalmente cualificados. Las rutas totalmente cualificadas empiezan por un . que representa la «raíz» de tu código base.
Muévete por el UCM con el comando cd de la CLI. Si un espacio de nombres no existe, cd creará uno cuando navegues hacia él. Para subir un nivel en el espacio de nombres puedes usar cd ...
Cuando cargo los tests, el UCM no encuentra la implementación de mi ejercicio.
Asegúrate de guardar tu fichero stub en el editor de texto y de hacer update de los términos en tu código base antes de cargar los tests.
Me encuentro con conflictos de nombres. No puedo tener dos términos llamados tests.
Puedes tener dos términos con el mismo nombre en espacios de nombres distintos. Si estás completando ejercicios de Exercism, se recomienda crear un espacio de nombres aparte para cada ejercicio, de modo que los tests y los stubs queden separados de los demás.
Mis tests pasan en local, pero no pasan el test runner.
¡Lo sentimos! Comprueba primero que tus importaciones no hagan referencia a nada que no sea la biblioteca estándar, base, y las funciones definidas en el fichero scratch que estás probando. Si es así, avísanos en el Slack de Exercism en #track-unison o abriendo un issue en el repositorio de la track de Unison.
Si tienes algún problema, ¡avísanos! 🙂