Translate

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

lunes, 9 de marzo de 2020

HTML + javascript + Haskell = ELM, parte 4


Seguimos con el post anteriro.

Como con cualquier lenguaje funcional, la base de Elm es la función. Definir una es trivial. Veamos algunas funciones :

> add x y = x + y
<function> : number -> number -> number
> double x = x * 2
<function> : number -> number
> anonymousInc = \x -> x + 1
<function> : number -> number
> double (add 1 2)
6 : number
> List.map anonymousInc [1, 2, 3]
[2,3,4] : [number]

La sintaxis para crear funciones es muy simple e intuitiva. add es una función con nombre con dos argumentos, x e y. Las funciones anónimas expresan parámetros como \ x, y el cuerpo de la función sigue los caracteres ->.
Como Elixir, Elm tiene el operador de tubería que permite componer funciones, de esta manera:


Tomamos 5 y lo pasamos como el primer argumento a anonymousInc, para obtener 6. Luego, lo pasamos como el primer argumento para duplicar. También podemos hacer que esa expresión se ejecute de derecha a izquierda:

> double <| anonymousInc <| 5
12 : number

Evan Czaplicki, creador de Elm, dice que obtuvo esta función de F#, que a su vez obtuvo la idea de las tuberías de Unix, por lo que esta idea ha existido por un tiempo, ¡pero es buena!
Al igual que con cualquier lenguaje funcional, hay muchas funciones que le permitirán trabajar con funciones de todo tipo de formas:

> List.map double [1..3]
[2,4,6] : List number
> List.filter (\x -> x < 3) [1..20]
[1,2] : List comparable

[1..3] es un rango. Puede explorar más funciones de la Lista con la biblioteca de listas.

Cuando está componiendo una solución con Elm, puede tener la tentación de codificar cada caso como un cuerpo de función separado como lo haría en Haskell, Erlang o Elixir, pero no se puede :( :

> factorial 1 = 1
<function> : number -> number'
> factorial x = x * factorial (x - 1)
<function> : number -> number
RangeError: Maximum call stack size exceeded

Parece que la segunda llamada reemplazó a la primera. En cambio, debe usar el mismo cuerpo de función y dividir el problema usando mayúsculas y minúsculas o si, de esta manera:

> factorial x = \
|  if | x == 0 -> 1 \
|      | otherwise -> x * factorial (x - 1)
<function> : number -> number
> factorial 5
120 : number

Suficientemente simple. factorial 0 es 1; de lo contrario, factorial x es x * factorial (x-1). Manejaría la recursividad de la lista de la misma manera:

> count list = \
| case list of \
| [] -> 0 \
| head::tail -> 1 + count tail
<function> : [a] -> number
> count [4, 5, 6]
3 : number

La cantidad de elementos de una lista vacía es cero y la cantidad de elementos de cualquier otra lista es 1 más la cantidad del resto. Veamos cómo atacar problemas similares con la coincidencia de patrones.

Por ahora vamos bien, pero seguimos en otro post... 


domingo, 1 de septiembre de 2019

Citas y condiciones en Factor


Similar a otros lenguajes, las funciones pueden ser mantenidas en variables, bueno en la pila. Estas clausuras se denominan “quotation” o citas y se escribe delimitado por [ ] .

[ 42 + ]

Veamos un ejemplo :

IN: scratchpad 20
--- Data stack:
20

IN: scratchpad [ 42 + ]
--- Data stack:
20
[ 42 + ]

IN: scratchpad call
--- Data stack:
62

Las citas son importantes y se utilizan para las condiciones.

La palabra if recibe como parámetro 1 condición y 2 citas y ejecuta el primero si es verdadero y el segundo de lo contrario :

IN: scratchpad 10 0 > [ "pos" ] [ "neg" ] if .
"pos"
IN: scratchpad -5 0 > [ "pos" ] [ "neg" ] if .
"neg"
IN: scratchpad "cool" [ "yes" ] [ "no" ] if .
"yes"

Por si hay dudas el if tiene la forma :

<condition> <true branch> <false branch> if

También podemos utilizar la palabra ? :

IN: scratchpad 10 0 > "pos" "neg" ? .
"pos"
IN: scratchpad -5 0 > "pos" "neg" ? .
"neg"

La palabra when y unless se puede utilizar con una sola cita :

IN: scratchpad 10 0 > [ "pos" . ] when
"pos"
IN: scratchpad -5 0 > [ "neg" . ] unless
"neg"

martes, 27 de agosto de 2019

Datos en Factor

Sigo con Factor y sus pilas.

Factor usa datos estandar como String, números, booleans y secuencias.
Veamos :

Tenemos booleanos:

IN: scratchpad 4 2 = .
f

IN: scratchpad 4 2 > .
t

IN: scratchpad "same" "same" = .
t

IN: scratchpad "same" length "diff" length = .
t

En Factor cualquier valor excepto f es considerado como true, incluyendo 0, el string vacio o la secuencia vacia.

Factor soporta una secuencia como un tipo de datos. Se puede crear una lista con { } y los valores separados por espacio un ejemplo sería :  { 4 3 2 1 } Es necesario el espacio luego de la llaves, similar a lisp.

Los mapas son colecciones key-value, veamos un ejemplo :

{ { "one" 1 } { "two" 2 } { "three" 3 } { "four" 4 } }

Con la palabra of y at podemos acceder a el valor con una key :

IN: scratchpad { { "one" 1 } { "two" 2 } { "three" 3 } } "one" of .
1
IN: scratchpad "two" { { "one" 1 } { "two" 2 } { "three" 3 } } at .
2


sábado, 24 de agosto de 2019

Matematicas en Factor

Seguimos con Factor

La palabras +, -, * y / toman dos valores de la pila y retorna el valor a la pila. El . toma un valor de la pila y lo imprime.

IN: scratchpad 40 2 + .
42
IN: scratchpad 40 2 - .
38
IN: scratchpad 20 9 * 5.0 / 32 + .
68.0

Muy similar a lisp pero utiliza notación postfija.

IN: scratchpad 5 4 * 20 + .
40
IN: scratchpad 20 5 + 4 * .
100

Como utiliza notación postfija no existe ambiguedad.

sábado, 17 de agosto de 2019

Factor un lenguaje de programación orientado a pilas

Sigo con Factor y sus pilas.

Vamos a hacer un “hola mundo” en Factor. Empezamos indicando el vocabulario “scratchpad”, pero por ahora no vamos a profundizar en eso. Luego vamos a escribir nuestro “hola mundo”

IN: scratchpad "Hello, world" print
Hello, world

Factor introduce a “Hola Mundo” a la pila y la función print toma de la pila el parametro y se ejecuta.

Introduciendo clear, factor limpia la pila y luego si ejecutamos “Hola Mundo”. Factor nos indica que esto se encuentra en la pila:

IN: scratchpad clear
IN: scratchpad "Hello, world"
--- Data stack:
"Hello, world"

Podemos introducir otro string a la pila :

IN: scratchpad "Hello, Factor"
--- Data stack:
"Hello, world"
"Hello, Factor"

Si ahora intentamos imprimir Factor va utilizar el ultimo valor insertado en la pila :

IN: scratchpad print
Hello, Factor
--- Data stack:
"Hello, world"

Si ejecutamos una funcion que retorne un valor, factor pondra ese valor en la pila.

IN: scratchpad length
--- Data stack:
12

La palabra (recuerden que las funciones se denominan "palabras") length tomó "Hello, world" de la pila y retorno la longitud de la cadena de nuevo y la puso en la pila. Cada palabra en Factor toma cero o más valores de la pila y llena cero o más valores en la pila. La siguiente palabra luego funciona con la pila resultante, y así sucesivamente.

Cuando se ejecuta un programa Factor, el efecto neto de todas las palabras reunidas juntas debe ser consistente, con cada palabra que tenga al menos tantos valores en la pila como esperan extraer, y eliminar tantos valores como afirman. Cuando la pila contiene más valores de los que necesita usar una palabra, los valores adicionales simplemente permanecen en la pila.

Un dato más los comentarios comienzan con un ! seguido de un espacio, veamos un ejemplo :

! This is a comment
"Hello, world" print ! This prints "Hello, world"


sábado, 3 de agosto de 2019

Componiendo funciones con Factor


La composición de funciones es un concepto muy importante permite dividir las funciones en funciones más pequeñas y comenzar con la entrada, pásela a través de una serie de funciones y obtener una salida de esta manera la salida de una función es la entrada a la siguiente función y así sustantivamente hasta obtener la salida. Por lo tanto cada función es pequeña y enfocada. Se resuelve problemas creando y conectando bloques de código.

Veamos un ejemplo pero primero JavaScript :

ar x = f(42);
var y = g(x);
return h(y);

o más resumido:

return h(g(f(42)));

En factor sería :

42 f g h

Sin nombres de variables y sin paréntesis, puntos o cualquier otro signo de puntuación para indicar la composición de la función. Se da a entender que el resultado de llamar a una función (llamada word o "palabra" en Factor) . Factor maneja esto automáticamente utilizando una pila, que es simplemente un contenedor que contiene valores. Una palabra toman su entrada de la pila y empujan su resultado a la pila, que luego es operada por la siguiente palabra.

Observe también que las palabras f g h se llaman en el mismo orden en que las leemos, de izquierda a derecha.

Esta llamada se puede ver como el pipe operator de Elixir  :

other_function(2) |> new_function() |> baz() |> bar() |> foo()

o el pipe operator de linux donde la salida de una operación es la entrada para otra, podemos hacer :

$ history | grep "apt"

En la versión de JavaScript, f es una función, y los paréntesis en f (42) indican que se aplica f al valor 42. Esto hace que JavaScript sea un lenguaje aplicativo. La mayoría de los otros lenguajes, como Java, Ruby, Python, Clojure, Scala, Haskell y Erlang, son aplicativos.

Factor es un lenguaje concatenante porque en lugar de aplicar funciones (o palabras), las concatena, simplemente escribiéndolas una tras otra.

La composición de funciones es la forma predeterminada de tratar una expresión como f g h. Otros lenguajes concatenativos incluyen Forth, Joy, PostScript, Cat, Om, Retro y Kitten. Si está familiarizado con Forth o Joy, notará algunas similitudes en Factor.

En lugar de escribir :

          wrapWordsAsList (capitalize (strip (text)))

puedes escribir :
       
          text strip capitalize wrapWordsAsList

Es una hermosa expresión!!!

Dejo link: https://factorcode.org/

jueves, 9 de julio de 2015

Seven More Languages in Seven Weeks: Languages That Are Shaping the Future

Alguna vez les hable del libro 7 lenguajes en 7 semanas, bueno las editorial The Pragmatic Bookshelf ha lanzado un nuevo libro con la misma temática. Los lenguajes a analizar son  Lua, Factor, Elm, Elixir, Julia, MiniKanren y Idris.

Y hasta tiene video y todo: 




Ya saben que regalarme!!

Dejo el link:
https://pragprog.com/book/7lang/seven-more-languages-in-seven-weeks