|
|
Una alternativa al uso de mapas es crear un "registro". Los registros están diseñados específicamente para este caso de uso y generalmente tienen un mejor rendimiento. Además, tienen un "tipo" con nombre que se puede utilizar para comportamiento polimórfico.
Los registros se definen con la lista de nombres de campo para instancias de registros. Se tratarán como claves de palabras clave en cada instancia de registro.
;; Define a record structure
(defrecord Person [first-name last-name age occupation])
;; Positional constructor - generated
(def kelly (->Person "Kelly" "Keen" 32 "Programmer"))
;; Map constructor - generated
(def kelly (map->Person
{:first-name "Kelly"
:last-name "Keen"
:age 32
:occupation "Programmer"}))
Los registros se utilizan casi exactamente igual que los mapas, con la salvedad de que no se pueden invocar como una función como los mapas.
user=> (:occupation kelly)
"Programmer"
Cuando necesitemos representar mucha información de dominio con el mismo conjunto de campos conocidos de antemano, se puede utilizar un mapa con nombre de atributos como claves. Algo así :
(def person
{:first-name "Kelly"
:last-name "Keen"
:age 32
:occupation "Programmer"})
Dado que se trata de un mapa, las formas que ya hemos analizado para buscar un valor por clave también funcionan:
user=> (get person :occupation)
"Programmer"
user=> (person :occupation)
"Programmer"
Pero realmente, la forma más común de obtener valores de campo para este uso es invocando la palabra clave. Al igual que con los mapas y conjuntos, las palabras clave también son funciones. Cuando se invoca una palabra clave, se busca a sí misma en la estructura de datos asociativa que se le pasó.
user=> (:occupation person)
"Programmer"
La invocación de palabras clave también toma un valor predeterminado opcional:
user=> (:favorite-color person "beige")
"beige"
Como se trata de un mapa, podemos usar assoc para agregar o modificar campos:
user=> (assoc person :occupation "Baker")
{:age 32, :last-name "Keen", :first-name "Kelly", :occupation "Baker"}
Y dissoc para eliminar campos:
user=> (dissoc person :age)
{:last-name "Keen", :first-name "Kelly", :occupation "Programmer"}
Es común ver entidades anidadas dentro de otras entidades:
(def company
{:name "WidgetCo"
:address {:street "123 Main St"
:city "Springfield"
:state "IL"}})
Puede usar get-in para acceder a los campos en cualquier nivel dentro de las entidades anidadas:
user=> (get-in company [:address :city])
"Springfield"
También puede utilizar assoc-in o update-in para modificar entidades anidadas:
user=> (assoc-in company [:address :street] "303 Broadway")
{:name "WidgetCo",
:address
{:state "IL",
:city "Springfield",
:street "303 Broadway"}}
Hay varias formas de buscar un valor en un mapa. La más obvia es la función get:
user=> (get scores "Angela")
1024
Cuando el mapa en cuestión se trata como una tabla de búsqueda constante, es común invocar el mapa en sí, tratándolo como una función:
user=> (def directions {:north 0
:east 1
:south 2
:west 3})
#'user/directions
user=> (directions :north)
0
No debe invocar directamente un mapa a menos que pueda garantizar que el resultado no será nulo:
user=> (def bad-lookup-map nil)
#'user/bad-lookup-map
user=> (bad-lookup-map :foo)
Execution error (NullPointerException) at user/eval154 (REPL:1).
null
Si deseamos realizar una búsqueda pero esperamos retornar a un valor predeterminado cuando no se encuentra la clave, debemos especifique el valor predeterminado como un parámetro adicional:
user=> (get scores "Sam" 0)
0
user=> (directions :northwest -1)
-1
El uso de un valor predeterminado también es útil para distinguir entre una clave que falta y una clave existente con un valor nulo.
Con la compra de oracle a Sun microsystem la empresa dueña de la base de datos decidió dar un impulso mayor al lenguaje Java. Y ...
|
Hoy, en nombre del equipo de Rust Core, me complace anunciar la Fundación Rust, una nueva organización independiente sin fines de lucro para administrar el lenguaje de programación y el ecosistema de Rust, con un enfoque único en apoyar al conjunto de mantenedores que gobiernan y desarrollan el proyecto. La Fundación Rust celebrará su primera reunión de la junta mañana, 9 de febrero, a las 4 pm CT. La junta directiva está compuesta por 5 directores de nuestras empresas miembros fundadores, AWS, Huawei, Google, Microsoft y Mozilla, así como 5 directores de liderazgo de proyectos, 2 que representan al Core Team, así como 3 áreas de proyecto: Fiabilidad, Calidad y Colaboración.
Así comienza el primer post de Rust Fundation y es esperable que esto impulse aun más el lenguaje...
Dejo link:
https://foundation.rust-lang.org/posts/2021-02-08-hello-world/
Lo que pasa es que GraalVM es un proyecto paraguas y dentro tiene varios proyectos que permiten hacer diferentes cosas. Veamos que podemos hacer con este proyecto:
1. Correr java más rápido. La JVM de GraalVM es más rápida que la jvm estandar.
2. Low-footprint, fast-startup Java
3. Podemos escribir aplicaciones poliglotas en : JavaScript, Java, Ruby y R
4. Ejecutar las aplicaciones java de forma nativa
5. Utilizar herramientas que funcionan en todos los lenguajes
6. Código Java como biblioteca nativa
7. Polyglot en la base de datos, correr aplicaciones Java en la base de datos.
8. Crear tu propio lenguaje.
Como se puede ver hay varias cositas. Vamos a centrarnos en cada una en post posteriores.
La versión 21 introduce una JVM escrita en Java. Con esta versión, Java on Truffle, una JVM escrita en Java que utiliza el framework Truffle, proporciona una opción adicional para ejecutar aplicaciones Java.
Java on Truffle, con nombre en código Espresso, se puede instalar utilizando GraalVM Updater que es un administrador de paquetes que descarga e instala paquetes que no están incluidos en la distribución principal de GraalVM.
gu install espresso
Para ejecutar una aplicación Java usando Java en Truffle, la opción -truffle debe pasarse al comando java.
java -truffle -jar awesomeApp.jar
Java on Truffle es una JVM minificada que proporciona todos los componentes centrales de una JVM como el intérprete de bytes code, la interfaz nativa de Java (JNI) y el protocolo Java Debug Wire (JDWP). Implementa las API de la biblioteca Java Runtime Environment (libjvm.so) y reutiliza todos los JAR necesarios y las bibliotecas nativas de GraalVM. Y al igual que con una JVM tradicional, Java on Truffle admite la ejecución de otros lenguajes basados en JVM como Kotlin.
Dado que está implementado en Java y puede ejecutar Java, Java en Truffle es esencialmente Java autohospedado o Java en Java. Esto abre oportunidades interesantes para investigar e innovar la JVM, ya que permite a los desarrolladores de Java leer y comprender el código fuente de la JVM y mejorarlo.
Dejo link:
Los mapas se representan como claves y valores alternados rodeados por {y}.
(def scores {"Fred" 1400
"Bob" 1240
"Angela" 1024})
Cuando Clojure imprime un mapa en el REPL, pondrá comas entre cada par clave / valor. Estos se utilizan exclusivamente para facilitar la lectura: las comas se tratan como espacios en blanco en Clojure.
;; same as the last one!
(def scores {"Fred" 1400, "Bob" 1240, "Angela" 1024})
Se agregan nuevos valores a los mapas con la función assoc (abreviatura de "asociar"):
user=> (assoc scores "Sally" 0)
{"Angela" 1024, "Bob" 1240, "Fred" 1400, "Sally" 0}
Si la clave utilizada en assoc ya existe, el valor se reemplaza.
user=> (assoc scores "Bob" 0)
{"Angela" 1024, "Bob" 0, "Fred" 1400}
La operación complementaria para eliminar pares clave-valor es dissoc ("disociar"):
user=> (dissoc scores "Bob")
{"Angela" 1024, "Fred" 1400}
Flutter es una tecnología que permite hacer aplicaciones mobile multiplataforma utilizando el lenguaje de programación Dart. Y la empresa canonical (dueña de Ubuntu) ha elegido esta tecnología para reescribir su instalador de sistema.
Por lo tanto en un futuro cercano vamos a tener un intalador de Ubuntu hecho en Flutter.
Y eso, dejo link: https://discourse.ubuntu.com/t/refreshing-the-ubuntu-desktop-installer/20659
a_list = [[1, 2], [3, 4], [5, 6]]
print(list(itertools.chain.from_iterable(a_list)))
# Output: [1, 2, 3, 4, 5, 6]
# o podemos hacer :
print(list(itertools.chain(*a_list)))
# Output: [1, 2, 3, 4, 5, 6]
Luego de aprender Javascript, aprendimos CofeScript (se acuerdan?) y luego Typescript y ahora llega Rescript.
Rescript es el lenguaje similar a JavaScript que estabas esperando. Es el slogan de este lenguaje, aunque yo no esperaba nada :P
Antes de ponerme a ver la instalación del entorno y todo eso, vamos a ver el lenguaje, veamos unos ejemplos:
// MyFile.res
let rec fib = n => {
switch n {
| 0 | 1 => 1
| n => fib(n -1) + fib(n-2)
}
}
Js.log(fib(0))
A simple vista se puede ver la influencia de los lenguajes funcionales.
Rescript aporta un sistema de tipos, podemos tener estructuras o tipos, veamos ejemplos :
//definimos una estructura persona
type rec person = {
name: string,
friends: array<person>
}
//Definimos tipos y los usamos
type intCoordinates = (int, int, int)
type floatCoordinates = (float, float, float)
let a: intCoordinates = (10, 20, 20)
let b: floatCoordinates = (10.5, 20.5, 20.5)
En fin, ReScript nos brinda muchas ventajas, como tipos, lazy values, objetos, etc .. Pero no veo, claramente algunas ventajas para migrar un proyecto Typescript a Rescript. Como me gustan los vs, tengo que hacer un post Rescript vs Typescript.
Dejo link: https://rescript-lang.org/