Archivos para Programacion

Conociendo Factor

Como estoy de vacaciones y soy un geek, no podía hacer otra cosa que aprender un lenguaje de programación nuevo y raro.

Pues bien. Hace meses que estoy dando vueltas como mosca sobre www.factorcode.org bajando los binarios del lenguaje, pero nunca me decidí a comenzar con el aprendizaje.

Pues bien. Hoy estaba aburrido y me puse manos a la obra. Para empezar, Factor tiene unas cuantas peculiaridades:

  • concatenativo
  • basado en pila
  • basado en Forth
  • requiere un procesador con instrucciones SSE 2 (posterior a Pentium 4) . Update ( 10/02/09 ): Si se compila desde el código fuente, se puede correr sobre procesadores más viejos. Las versiones precompiladas de Factorcode son las que requieren las instrucciones especiales.

Lo primero significa en términos rápidos y groseros, que los operandos van primero y el operador al final. Por ejemplo:

(1 + 2) / 5 en Factor se escribe 1 2 + 5 /

Lo segundo indica que la estructura principal de almacenamiento de datos es una pila. Es decir, todos los datos se insertan y quitan de una pila que maneja el lenguaje. Ésto permite simplificar un montón las cosas, sobre todo en lo que es la forma de “decir” las cosas.

Continuando con el ejemplo anterior, lo que sucedió es lo siguiente:

  1. al escribir 1 2 se “pushean” en la pila los elementos 1 y 2
  2. ” + ” es una función que toma dos elementos de la pila y le inserta el resultado, por lo que queda un 3 en la pila.
  3. luego se le inserta un 5, por lo que en la pila queda ” 3 5 “
  4. y finalmente ” / ” toma dos operandos de la pila y “pushea” el resultado nuevamente, por lo que queda ” 3/5 ” (si, queda como fracción, no como punto flotante).

Pero para cosas más interesantes viene lo tercero. Forth es un lenguaje bastante viejo, pero muy visionario en su época. Combina un intérprete interactivo con un compilador. El usuario escribe de manera interactiva las subrutinas que en Forth se denominan “palabras” ( “words” ). Previsiblemente un conjunto de palabras forman un “vocabulario”. Las palabras se compilan, debuggean y reescriben de manera interactiva, todo mediante una máquina virtual.

De la misma manera, en Factor trabajamos en un entorno, definiendo palabras, que trabajan sobre una pila.

Entorno de Factor

Entorno de Factor

Por ejemplo, una secuencia se escribe entre llaves.

{ 1 2 3 4 }

Para definir una función que obtenga el promedio de la secuencia anterior hacemos

: average ( seq -- n ) dup sum swap length / ;

Y por supuesto podemos probar haciendo

{ 1 2 3 4 } average .

que retorna “2+1/2″.

Lo que hace la palabra “average” es duplicar el contenido de la cima de la pila (queda la secuencia repetida), luego hacer la sumatoria del la primer secuencia, y se deposita el resultado en la cima de la pila. Intercambiamos (“swap”) el primer elemento de la pila por el segundo (queda la secuencia en la cima). Obtenemos la longitud de la secuencia y depositamos el resultado en la pila. Finalmente obtenemos el resultado final realizando el cociente entre los dos elementos que hay en la pila.

Por supuesto que esto no demuestra todo el lenguaje ni su potencial, pero mi intención es introducirlos un poco en el tema.

Un punto feo de Factor es que no existe mucha documentación para el principiante. Si bien el lenguaje incluye muchísimo código y documentación, es para gente ya “fluente” en el lenguaje. Los que comenzamos tenemos que ir dilucidando por prueba, error y algún que otro chispazo de inspiración.  Pero la gente de Factor está trabajando en éso. Piensen que el lenguaje todavía está en “beta”, aunque es funcional y ya sirve para realizar un montón de cosas.

Si quieren investigar más al respecto pueden consultar los siguientes enlaces:

http://en.wikipedia.org/wiki/Stack-oriented_programming_language

http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_basado_en_pila

http://concatenative.org/

http://factor-language.blogspot.com/2009/01/advantages-of-concatenative-and-stack.html

http://learnfactor.org/

Esta es una charla de Slava Pestov, el mismísimo creador de Factor. Si entienden inglés, se la recomiendo.

Dejar un comentario

Ejemplo de lógica difusa en Python

Continuando con el post anterior, aca hay un ejemplo que usa lógica difusa. El programa es muy tonto, pero mi intención es que se vea la manera de utilizar la lógica difusa.

Este programa simula un sistema en donde un ventilador impulsa hacia arriba un objeto dentro de un cilindro vertical, de manera que el objeto se mantenga suspendido a una altura determinada.


    |     |
    |     |
    |     |
    |     | <-- altura buscada
    |  *  |
    |  '  |
    |     |
    | { { |
    | } } |
     vent

El ventilador variará la potencia de soplo de acuerdo a la altura en que se encuentra el objeto.

Utilicé mucho las funciones lambda porque permite definir funciones con muchos de sus parámetros ya fijados, de manera que puedo hacer el código más ”significativo”.

Leer el resto de esta entrada »

Dejar un comentario

Lógica difusa

La lógica difusa ( “fuzzy logic” ) es una manera de trabajar con lógica, utilizando valores continuos, a diferencia de los tajantes valores discretos de la lógica tradicional ( 0 y 1, Verdadero y Falso….).

Básicamente la idea es ésta. Las computadoras trabajan con lógica de Verdadero y Falso. Todas las cosas tienen que caer necesariamente en alguna de esas dos categorías. En cambio los seres humanos pensamos con diversos grados de verdad, los cuales son difusos, es decir, no tienen un grado definido y exacto de verdad. Palabras como “mucho”, “poco”, “más o menos”, “quizás”, “posiblemente”, “seguro” indican los diferentes grados de verdad que le podemos asignar a un predicado. Entonces la lógica difusa sirve para hacer que la computadora trabaje con nuestros términos o grados de verdad.
Leer el resto de esta entrada »

Dejar un comentario

Pensamientos sobre programación (01)

Leyendo el blog de Fabio, leo esta pequeña lista de “12 señales que indican que eres un mal programador”, cuyo autor es Damien Katz.

Más allá de los razonamientos obvios del tipo “hay más de 12 razones por las que uno podría darse cuenta de que programa mal”, me quedé pensando en alguno de los ítems de la lista.

“Java es todo lo que necesitas” . Esto tiene bastante que ver con lo que escribió PaulGraham en “Beating the Averages”. Básicamente existen dos factores que inclinarían a alguien a decir algo como “<lenguaje X> es todo lo que necesito” o como la conocemos acá, la ley del martillo. El primero es que es más fácil. El factor “facilidad” es poderoso en muchas áreas de la vida de todo el mundo, ya que es natural inclinarse a hacer lo fácil, no así lo mejor. Es más fácil usar lo que ya conozco, que (en nuestro caso) investigar la herramienta más adecuada, posteriormente aprender a utilizarla y finalmente resolver el problema. El segundo factor es el “mercado” o mejor dicho el factor de “la mayoría”. Por varias razones, las cosas son “más fáciles” cuando hacemos lo que hace la mayoría. Si la mayoría es inducida (por una cuestión de mercado o por la que sea) a utilizar el producto X, tendremos mayores posibilidades de soporte, de encontrar un trabajo, de que otros utilicen nuestro producto, comprensión de nuestro código por parte de una mayor cantidad de programadores…
Leer el resto de esta entrada »

Dejar un comentario

IM IN MY COMPUTER HAXIN MY CODE! LOL!

Via Lambda The Ultimate

http://lolcode.com/

Un lenguaje de programación “esotérico” derivado del dialecto utilizado en los tagboards (e imageboards) de Something Awful, Yotsuba (aka 4Chan) y especialmente Lolcat.

Si no es útil, por lo menos es muy gracioso de leer. Hasta sería interesante contribuir para aprender cómo se diseña o implementa un lenguaje de programación.

Tiene características interesantes como por ejemplo:

  • Se escribe en mayúculas, porque “Caps Lock is cruise control for cool”.
  • Es muy autodocumentante. Sino miren éste código:
HAI

CAN HAS STDIO?

PLZ OPEN FILE "LOLCATS.TXT"?

 AWSUM THX

 	VISIBLE FILE

 O NOES

 	INVISIBLE "ERROR!"

KTHXBYE

O este

HAI

CAN HAS STDIO?

I HAS A VAR

GIMMEH VAR

IZ VAR BIGGER THAN 10?

 YARLY

 	BTW this is true

 	VISIBLE "BIG NUMBER!"

 NOWAI

 	BTW this is false

 	VISIBLE "LITTLE NUMBER!"

 KTHX

KTHXBYE

Es lo que Visual Basic tendría que haber sido desde un principio!

Dejar un comentario

R6RS vs. R5RS o cómo evolucionar y seguir siendo igual…

Estuve leyendo la R6RS, y como sarcásticamente señaló el amigo Arto Bendiken en su artículo, la nueva definición aparenta contradecir la frase misma que le da inicio.

“Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary.”
Los lenguajes de programación no deberían ser diseñados apilando característica sobre característica, sino quitando las debilidades y restricciones que hacen a las características adicionales parecer necesarias.

La nueva definición “creció” un 60% con respecto a su versión anterior. La generalidad de los cambios apunta a combatir o mitigar los “puntos débiles” de Scheme que eran

  • carencia de librerías
  • necesidad del programador de “reinventar la rueda” como bien le pareciera (o entender como otros pensaron la rueda)
  • carencia de un sistema evolucionado de módulos y paquetes como en otros lenguajes más conocidos
  • mejor (más amigable) manejo de las excepciones y errores

Leer el resto de esta entrada »

Dejar un comentario

Segundas experiencias con Scheme

Esto se está poniendo interesante. Acabo de enterarme que publicaron la nueva definición de Scheme, la R6RS, y por supuesto, hay controversia.

Por esas cosas de la vida, terminé en el blog de Arto Bendiken, que publicó un par de artículos muy interesante, uno en contra del R6RS, y otro contando sus experiencias con el acercamiento al mundo LISP. Coincido con bastante de lo que dijo en el último artículo, pero rescato dos observaciones a las que yo también llegué por mis propios medios:

  • El camino a la iluminación está plagado de irritantes y superfluos paréntesis. Pero vale la pena el esfuerzo.
  • CommonLisp es anacrónico. Y Scheme es tan minimalista que es poco práctico en más de un caso.

En conclusión.LISP te abre la cabeza. Pero a nivel abstracto. Porque en el mundo real te enfrentas con diferencias en cuanto a la implementación, los estándares, la idoneidad o existencia de librerías, y por supuesto, acostumbrarse a esos irritantes pero extremadamente útiles paréntesis.

Sin embargo prosigo en el camino, porque aunque al principio parezca costoso, conozco que existe un más allá que me ofrece mejores posibilidades que los supuestos “lenguajes de alto nivel” que el mercado me ha dicho que tengo que usar.

Dejar un comentario

Primeras experiencias con Scheme

Luego de mucho investigar y probar con diferentes lenguajes me aboqué a la tarea de aprender Scheme por las siguientes razones

Investigué, bajé tutoriales, libros, leí código… en fin, lo usual para cuando uno debe aprender solo. Qué es lo que me quedó de la última semana?

  • Muy simple. Me leí el R5RS en un día, y lo mejor es que se entiende.
  • Muy áspero. Me llevó varios intentos implementar una función map() por mi cuenta. Fortalece el carácter :)
  • Muy abandonado a su suerte. Carencia de librerías fundamentales para que sea un lenguaje mainstream. Todo está para ser implementado. Por suerte hay gente que se dedica a implementar cosas. Por ejemplo, la maravillosa librería SSAX.
  • Muy prometedor. Tiene un potencial increíble. Lástima que sea tan … Scheme :)

Los seguiré manteniendo al tanto de mis “descubrimientos”.

Dejar un comentario

Metaclases en Python (parte 1)

Para hacerlo corto, metaclases son “clases de clases”. En los lenguajes orientados a objetos, en donde las clases también pueden ser manipuladas como “objetos”, lo que actúa como plantilla de las mismas son las metaclases. Si desean leer más sobre el tema, en está plagado de artículos en otros lados que les darán una mejor idea de lo que yo puedo darles en éste momento.

Desde Python 2.2 el sistema de metaclases se ha mejorado mucho. Pero vamos a comenzar con algo simple.
Hagamos una función que retorne una clase. La función recibirá los componentes de la clase (atributos y métodos) en un diccionario.
Leer el resto de esta entrada »

Dejar un comentario

Por qué la gente no usa Haskell?

Esto es una serie de pensamientos que me llegaron a la cabeza al leer éste ensayo sobre las fallas de Haskell.

Vamos a comenzar de a poco:

“The fact that Perl, Python and Ruby have become popular while Haskell has stayed a marginal language is a failure of the Haskell community. The Haskell community has failed to build a useful distribution Haskell, and it has failed to position the language as something that people can use to solve their problems.”

Leer el resto de esta entrada »

Comentarios (4)

Entradas más antiguas »