El sitio oficial del lenguaje nos dice:
Flix es un lenguaje de programación funcional, imperativo y lógico, basado en principios y orientado a los efectos, desarrollado en la Universidad de Aarhus y por una comunidad de colaboradores de código abierto .
Los sistemas de efectos representan la siguiente gran evolución en los lenguajes de programación de tipado estático. Al modelar explícitamente los efectos secundarios, la programación orientada a efectos fomenta la modularidad y facilita el razonamiento del programa.
Los efectos y manejadores definidos por el usuario permiten a los programadores implementar sus propias estructuras de control.
A todo esto, ¿Qué es la programación orientada a efectos?
Flix y la programación orientada a efectos
La programación orientada a efectos (Effect-Driven Programming o gestión de efectos algebraicos) es un paradigma de programación que busca controlar y modelar de forma explícita los efectos secundarios de un programa, como si fueran tipos de datos comunes.
A diferencia de la programación imperativa tradicional (donde los efectos secundarios como modificar una variable global, escribir en disco o hacer una petición HTTP ocurren de forma libre y oculta), este enfoque los separa de la lógica pura del negocio.
Algunas características del lenguaje Flix:
- Funciona con Java (con la JVM).
- Incluye tipos de datos algebraicos y coincidencia de patrones (pattern matching), registros extensibles, rasgos, tipos de orden superior, tipos y efectos asociados, concurrencia estructurada, entre otras cosas.
- Soporte a tuplas y registros.
- Efectos polimórficos.
- Efectos algebraicos.
- Efectos de biblioteca.
- Mutación local basada en la región.
- Estructuras mutables.
- Reflexión de pureza.
- Paralelismo y concurrencia estructurada.
- Rasgos, tipos de clase superior y tipos asociados.
- Efectos asociados.
- Etc.
Flix vs otros lenguajes
Flix es un lenguaje de programación funcional, lógico e imperativo basado en principios, se inspira en OCaml y Haskell, con ideas de Rust y Scala. Flix se parece a Scala, pero su sistema de tipos se basa en Hindley-Milner, que admite la inferencia completa de tipos.
Se compila a código de bytes JVM eficiente, se ejecuta en la Máquina Virtual de Java y admite la eliminación completa de llamadas recursivas. Flix es interoperable con Java y puede usar clases y métodos de la JVM. Por lo tanto, todo el ecosistema Java está disponible desde Flix.
Instalando el lenguaje
Verificamos la versión de Java, necesitas al menos la versión 21.
$ java -version
Se recomienda tener la siguiente extensión de Visual Studio Code: https://marketplace.visualstudio.com/items?itemName=flix.flix
Una vez instalado, crearemos un proyecto ``proyecto-flix`` y abrimos Visual Studio Code:
$ mkdir proyecto-flix $ cd proyecto-flix $ code .
Crearemos un archivo llamado ``Main.flix``, como se puede ver el código se parece al de un programa Scala:
def main(): Unit \ IO = println("Hola, mundo!")
Al abrir Visual Studio Code comenzará la compilación.
Si la compilación (y ejecución) es correcta, entonces veremos esto en la consola:
Hola, mundo!
El compilador puede presentar ciertos issues como este:
#lix> # An unexpected error has been detected by the Flix compiler: # # Unexpected illegal effect set on entry point (Prelude.flix:141:24) # # This is a bug in the Flix compiler. Please report it here: # # https://github.com/flix/flix/issues # # -- Flix Compiler -- # # Flix Version : 0.78.0 # incremental: All # # -- Java Virtual Machine -- # # JVM Version : 21.0.1 (2023-10-17) # JVM Vendor : Oracle Corporation # JAVA_HOME : C:\Java\jdk-21 # System : Windows 10 (10.0) # # -- Stack Trace -- ca.uwaterloo.flix.util.InternalCompilerException: Unexpected illegal effect set on entry point (Prelude.flix:141:24) at ca.uwaterloo.flix.language.phase.monomorph.Lowering$.wrapDefWithDefaultHandlers(Lowering.scala:875) at ca.uwaterloo.flix.language.phase.monomorph.Lowering$.lowerDef(Lowering.scala:106) at ca.uwaterloo.flix.language.phase.monomorph.Specialization$.$anonfun$run$4(Specialization.scala:330) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18) at ca.uwaterloo.flix.api.Flix.profile(Flix.scala:159) at ca.uwaterloo.flix.language.phase.monomorph.Specialization$.$anonfun$run$3(Specialization.scala:325) at ca.uwaterloo.flix.language.phase.monomorph.Specialization$.$anonfun$run$3$adapted(Specialization.scala:324) at ca.uwaterloo.flix.util.ParOps$.$anonfun$parMap$2(ParOps.scala:56) at ca.uwaterloo.flix.util.ParOps$.$anonfun$parMap$2$adapted(ParOps.scala:56) at ca.uwaterloo.flix.util.ParOps$.$anonfun$parFold$2(ParOps.scala:232) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Unexpected illegal effect set on entry point (Prelude.flix:141:24)ca.uwaterloo.flix.util.InternalCompilerException: Unexpected illegal effect set on entry point (Prelude.flix:141:24) at ca.uwaterloo.flix.language.phase.monomorph.Lowering$.wrapDefWithDefaultHandlers(Lowering.scala:875) at ca.uwaterloo.flix.language.phase.monomorph.Lowering$.lowerDef(Lowering.scala:106) at ca.uwaterloo.flix.language.phase.monomorph.Specialization$.$anonfun$run$4(Specialization.scala:330) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18) at ca.uwaterloo.flix.api.Flix.profile(Flix.scala:159) at ca.uwaterloo.flix.language.phase.monomorph.Specialization$.$anonfun$run$3(Specialization.scala:325) at ca.uwaterloo.flix.language.phase.monomorph.Specialization$.$anonfun$run$3$adapted(Specialization.scala:324) at ca.uwaterloo.flix.util.ParOps$.$anonfun$parMap$2(ParOps.scala:56) at ca.uwaterloo.flix.util.ParOps$.$anonfun$parMap$2$adapted(ParOps.scala:56) at ca.uwaterloo.flix.util.ParOps$.$anonfun$parFold$2(ParOps.scala:232) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583)
Para resolverlo deberás probar el programa con un JDK 17.
Enlaces:
https://flix.dev/https://effectorientedprogramming.com/
https://en.wikipedia.org/wiki/Effect_system
https://effekt-lang.org/
https://doc.flix.dev/getting-started.html
https://neovim.io/
https://en.wikipedia.org/wiki/Flix_(programming_language)




Comentarios
Publicar un comentario