Translate

Mostrando las entradas con la etiqueta Racket. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Racket. Mostrar todas las entradas

lunes, 1 de junio de 2020

Erlang en el panorama de la programación funcional.

Erlang es pragmático. Erlang es funcional, pero permite algunos efectos secundarios. Por ejemplo, la forma en que se maneja la comunicación en Erlang es como un efecto secundario. Pero Erlang evita algunos tipos de efectos secundarios. No mantiene estado, tiene lo que se llama asignación única estática. Entonces, aunque el lenguaje en sí es relativamente libre, hay herramientas que ayudan a garantizar la seguridad de los programas que escribimos. Así que hay un buen equilibrio pragmático. 

Si nos fijamos en el panorama del lenguaje de programación funcional, hay bastantes lenguajes que se denominan funcionales. Muchos lenguajes son lo que se llama fuertemente tipado. Lo que queremos decir con tipado fuerte es que cualquier error de tipo que sucede en el lenguaje, lo obtendremos en el momento de la compilación. No se obtienen errores de tipo de tiempo de ejecución. En este grupo tenemos lenguajes como Haskell y Miranda, que tienen lo que se denomina evaluación perezosa.

Lo que eso significa es que la evaluación de las expresiones está impulsada por la demanda. Entonces, en lugar de la evaluación tradicional, que se llama evaluación estricta, donde los argumentos de las funciones se evalúan a medida que se pasan a la función, antes de evaluar el cuerpo de la función. En Haskell y Miranda, los argumentos solo se evalúan cuando la evaluación del cuerpo lo requiere. Por lo tanto, es muy posible que un argumento no se evalúe en absoluto. O es posible que un compuesto, una estructura de datos, solo se evalúe parcialmente. Y esto permite tipos de estructuras de datos infinitos. 

A la vez Haskell y Miranda son completamente puros. No tienen ningún efecto secundario en absoluto. Y eso se debe a que los efectos secundarios y la evaluación perezosa encajan muy mal. La pereza te obliga a ser puro. Esto se debe a que no sabe cuándo se evaluarán partes particulares de una expresión. Entonces, no sabes cuándo ocurriría ese efecto secundario, si estuviera allí. Por otro lado, lenguajes como ML y OCaml y F# tienen una evaluación estricta. Y tienen algunas impurezas. Diferentes lenguajes tienen diferentes equilibrios de impureza, así como Erlang tiene efectos secundarios, tiene impureza en sus primitivas de comunicación. 

Los demás, ML, OCaml, etc., la familia ML son estrictos. Pero estos lenguajes están fuertemente tipados. En el otro extremo del espectro, hay lenguajes débilmente tipados de la familia LISP. Y estos son inherentemente no escritos, si lo desea. Porque construido en el corazón de ellos, tienen una función de evaluación. Entonces puede construir datos y luego evaluar esos datos. Por lo tanto, no hay forma de que sepa de antemano qué tipo de datos tendrá la construcción cuando se evalúen. LISP tiene una larga historia. LISP se inventó por primera vez hace más de 50 años. Y los descendientes de LISP como Common Lisp y Scheme y Racket se usan ampliamente en la actualidad. Pero el núcleo de esos lenguajes es el uso sofisticado de macros y el uso de eval para hacer que estos lenguajes sean muy reflexivos. Pero eso difiere del tipo de cosas que se hacen en Erlang. 

Si para ser un lenguaje de programación funcional, todo lo que necesita es tener una lambda que le permita definir funciones anónimas, entonces tenemos una gran clase de lenguajes de programación funcional. Debido a que Java, JavaScript, Ruby, C ++, casi todos los lenguajes en los que se puede imaginar están obteniendo un lambda, permiten la facilidad de tener funciones anónimas simplemente porque han demostrado ser muy útiles en paradigmas de programación funcional como MapReduce, etc. Pero no se puede considerara estos últimos lenguajes como funcionales. 

domingo, 21 de octubre de 2018

Jugando con Lisp y Racket

Hace rato que no juego con lisp, por lo tanto vamos a hacer una pequeña función para contar elementos de una lista:

(defun contar(lista)
  (cond
     ((null lista) 0)
     (T (+ 1 (contar (rest lista))))
  )
)

Si probamos esto:

CL-USER 1 > (contar '(1 2 3 4 5))
5

Veamos el mismo programa en Racket: 

(define (contar lista)
  (cond
     [(empty? lista) 0]
     [else (+ 1 (contar (rest lista)))] 
  )
)

> (contar (list 1 2 3))
3

Como se puede ver Racket es un hijo o nietos de lisp, por ende tienen la misma sintasis.  

lunes, 21 de marzo de 2016

Programación lógica con miniKanren

Siempre pero siempre pero siempre que escuchamos sobre programación lógica, relacionamos con prolog y hacemos bien. Pero prolog no es la única opción.

Con ustedes miniKanren.

miniKanren es un DSL (Domain Specific Language) para la programación logica.

miniKanren es muy simple, con sólo tres operadores lógicos y un operador de interfaz.
La primera implementación fue en scheme, pero ahora existen implementaciones en diferentes lenguajes y tecnologías como Racket, Clojure, Haskell, Python, JavaScript, Scala, Ruby, OCaml, PHP y algunos más.

miniKanren fue diseñado para ser simple y fácil pero a la vez fácil de extender.

Veamos un ejemplo:

(run* [q] (== q 1))

Esto parece una linea de codigo pero hace muchas cosas.

run* retorna la lista de comandos que se pueden ejecutar. q es una variable booleana.

Como podemos ver miniKanren es simple y open source!

Dejo link: http://minikanren.org/

lunes, 7 de diciembre de 2015

Racket 6.3 se viene con todo!!


Ya he hablado de racket es como scheme pero libre, es genial. Trae hasta el Dr. scheme, que se llama Dr. racket (como es de esperar)

En su nueva versión hizo unos pasos importantes, para enumerar algunas de las mejoras:

  • Introduce un nuevo macro expander, este es un nuevo sistema de macros (que es no del todo compatible con el viejo sistema)  el nuevo macro expander es más fácil de usar que el anterior, ofrece un mejor diagnóstico cuando los enlaces fallan, tiene una aplicación más simple, y por lo tanto es menos propenso a errores.
  • Mejoras en su Redex DSL, entre las mejoras hace un mejor y m{as simple chequeo de la sintaxis. 
  • Y soporte para GTK3

Como les conté es software con licencia LGPL y además podemos bajarlo gratuitamente!!

Dejo link:
http://www.infoq.com/news/2015/12/racket-63-released
http://racket-lang.org/


miércoles, 4 de septiembre de 2013

Learn X in Y minutes

Una muy buena pagina para aprender lenguajes de programación, muestra un resumen de los lenguajes para que se puedan aprender rápidamente; entre otras cosas tiene:

  • Where X=c
  • Where X=clojure
  • Where X=coffeescript
  • Where X=Common Lisp
  • Where X=c#
  • Where X=dart
  • Where X=elisp  
  • Where X=elixir
  • Where X=erlang
  • Where X=F#
  • Where X=Go
  • Where X=Groovy
  • Where X=haskell
  • Where X=haxe
  • Where X=java
  • Where X=javascript
  • Where X=julia
  • Where X=LiveScript
  • Where X=lua
  • Where X=Matlab
  • Where X=Objective-C
  • Where X=perl
  • Where X=php
  • Where X=python
  • Where X=R
  • Where X=racket
  • Where X=ruby
  • Where X=Scala
  • Where X=Visual Basic
  • Where X=whip

Dejo link: http://learnxinyminutes.com/

sábado, 15 de junio de 2013

Racket


Como les aconseje en el siguiente post : http://emanuelpeg.blogspot.com.ar/2013/06/introduction-to-systematic-program.html; un curso que esta muy bueno en cursera es "Introduction to Systematic Program Design". En este curso se utiliza el lenguaje Racket.

Racket es un lenguaje de la familia de lisp/scheme, multiparadigma y es un lenguaje de propósito general que se utiliza para la enseñanza, investigación y para cualquier otra cosa. Tiene un entorno que se llama DrRacket, funciona en diferentes plataformas; yo lo estoy corriendo en Linux sin problemas.

Como se pueden imaginar al ser un lenguaje derivado de lisp es funcional, pero también fue influido por scheme y eiffel. De este ultimo toma la programación dirigida por contratos. A la vez soporta macros y es muy extensible. Una cosa curiosa es que soporta elementos gráficos, en realidad me resulta curioso a mi, podemos hacer esto:

(require 2htdp/image)
(triangle 80 'solid 'red)

y dibujara un triangulo.

Esta muy bueno para enseñar programación funcional y también para introducir a los alumnos a programación dirigida por contratos.

También tiene funciones similares a doctest de python es decir podemos hacer:

;; devuelve la suma de dos nros
(check-expect (suma 2 3) 5)
(check-expect (suma 5 3) 8)
(check-expect (suma 2 30) 32)
(check-expect (suma 2 -3) -1)

(define (suma nro1 nro2)
  (+ nro1 nro2)
 )

y haciendo esto la ide nos devolverá: "All 4 tests passed!"

Es lanzado con licencia LGPL por lo tanto lo podemos usar para hacer proyectos GPL y también comerciales.

Dejo links:
http://racket-lang.org/
https://en.wikipedia.org/wiki/Racket_(programming_language)

Dejo unas fotos de la IDE: