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

jueves, agosto 12, 2010

Lectura y Escritura en Lisp II

Hola otra vez,

Siguiendo el post anterior, continuamos con la pregunta que nos hacía un lector de este blog en esta entrada: http://aitoreus.blogspot.com/2007/10/lisp-1-leccin.html


Vamos a hacer el típico programa que nos dice si un número es primo o no.

Primero lo haremos de la forma habitual en Lisp, que es como me lo he encontrado en el foro de Ubuntu. Programando de esta forma no hace falta que utilicemos ninguna función de entrada-salida:




Yo utilizo el editor VIM porque me reconoce la sintaxis de cualquier lenguaje de programación.



Como véis lo único que hacemos es definir la función isprime().

Una vez que tengamos el Common Lisp instalado haremos lo siguiente:

1.-Botón derecho sobre el fichero de texto ISPRIME.LSP

2.-Seleccionar "COMPILE WITH CLISP".

3.-Botón derecho sobre el fichero que se ha generado ISPRIME.FAS

4.-Seleccionar "LOAD INTO CLISP".


De esta forma se carga en Clisp y podremos ejecutar... isprime pasándole el número que queremos comprobar:


Siguiendo las convenciones de Lisp la función devuelve T (true) si el número es primo y NIL (false o lista vacía) si no es primo.


Y ahora lo que me preguntaban... Cómo hacer una ejecución limpia donde sea el programa el que nos pregunte por el número.


Pues el programa adaptado quedaría así:



Hemos añadido un print, un read, una asignación de la entrada a una variable.

La diferencia es que ahora podemos ejecutarlo directamente sin cargar en CLisp la función.

Se haría dando al botón derecho sobre el fichero ISPRIME2.FAS y haciendo clic en "EXECUTE WITH CLISP".


Nota: he puesto al final una llamada a la función READ-LINE para que antes de cerrarse la ventana podamos ver el resultado. En cuanto le metes un ENTER se cerrará la ventana.


Saludos.

martes, agosto 03, 2010

Lectura y escritura en Lisp

Hola,
En una entrada antigua del 30/10/2007 me preguntan en la sección de comentarios cómo sería un programa lisp que recoja datos desde el teclado.

Ahora es tarde. Mañana pondré algún ejemplo útil. Ahora vamos a ver cómo sería la teoría.

Lo primero bajar el COMMON LISP que es "el Lisp que hay que aprender". El sitio es este: http://clisp.cons.org/

y yo me lo he bajado de aquí para Windows: http://sourceforge.net/projects/clisp/files/clisp/2.49/clisp-2.49-win32-mingw-big.exe/download

En teoría con las primitivas PRINT, READ y FORMAT debería ser suficiente.

PRINT: evalúa el argumento que le pasamos y lo imprime.

(setf velocidad 120)
(print velocidad)

READ: Cuando el intérprete encuentra esta primitiva se queda a la espera de que tecleemos algo. Read no imprime nada por lo que habrá que usar PRINT para hacer la pregunta de marras.

(print '(Introduce tu nombre chavalote))
(setf nombre (read))

FORMAT: Esta primitiva permite más opciones que PRINT por medio del uso de directivas. Como os decía mañana lo aclaramos con un ejemplo.

Saludos.

lunes, febrero 22, 2010

Cuando utilizar LISP

He encontrado un buen artículo sobre la conveniencia de utilizar el lenguaje LISP para resolver problemas con algunas características concretas. Recordad que junto con FORTRAN es uno de los lenguajes más antiguos de todos, y que todavía hoy en día tiene buena salud. Me ha parecido que está muy bien.

http://www.lispworks.com/products/myths_and_legends.html


Saludos.

lunes, diciembre 24, 2007

Asombrosa solución del problema

Pues si, no se si alguien lo ha intentado pero la resolución es asombrosa. Parece mentira que la cosa pueda funcionar y seguramente la mayoría dude de que funcione:

Creamos un fichero de texto llamado hanoi.lsp por ejemplo.

(defun hanoi (num-discos torre-origen torre-auxiliar torre-destino)
(when (> num-discos 0)
(hanoi (1- num-discos) torre-origen torre-destino torre-auxiliar)
(format t "~%Mover disco superior de la torre ~D a la torre ~D."
torre-origen torre-destino)
(hanoi (1- num-discos) torre-auxiliar torre-origen torre-destino)
)
T
)

Cargamos la función en el interprete lisp:
> (load 'hanoi)

y ya podemos verlo en funcionamiento:

Para 5 discos, torre 1 de origen, torre 2 auxiliar y torre 3 destino...

> (hanoi 5 1 2 3)



El resultado para (hanoi 4 1 2 3) es el siguiente:

> (hanoi 4 1 2 3)

Mover disco superior de la torre 1 a la torre 2.
Mover disco superior de la torre 1 a la torre 3.
Mover disco superior de la torre 2 a la torre 3.
Mover disco superior de la torre 1 a la torre 2.
Mover disco superior de la torre 3 a la torre 1.
Mover disco superior de la torre 3 a la torre 2.
Mover disco superior de la torre 1 a la torre 2.
Mover disco superior de la torre 1 a la torre 3.
Mover disco superior de la torre 2 a la torre 3.
Mover disco superior de la torre 2 a la torre 1.
Mover disco superior de la torre 3 a la torre 1.
Mover disco superior de la torre 2 a la torre 3.
Mover disco superior de la torre 1 a la torre 2.
Mover disco superior de la torre 1 a la torre 3.
Mover disco superior de la torre 2 a la torre 3.
T



Lo más importante es que para estas soluciones mágicas hay que asegurarse bien de que se pueda solucionar recursivamente. En el caso de HANOI era fácil, ya que es el problema recursivo más clásico de todos.

Saludos.

lunes, octubre 29, 2007

Lisp

Lisp fue el segundo lenguaje de alto nivel creado. El primer compilador lo desarrolló John Backus y fue de Forfran. En 1958 John McCarthy propone Lisp en el ámbito de la inteligencia artificial.

Debido a la antiguedad y las características "especiales" del lenguaje no es de extrañar que lenguajes más modernos recojan algunas características.

Los "arrays asociativos" de Perl por ejemplo recuerdan técnicas muy comunes en Lisp.

Lisp viene de List processing (procesamiento de listas) y es una expresión muy acertada. Todo en lisp son listas. Los programas son listas y los datos son listas.

Esta circunstancia hace que sea muy sencillo hacer un programa lisp cuyo resultado sea un programa generado en tiempo real en base a los datos de entrada. También es sencillo modificar o ampliar el lenguaje. Símplemente hay que crear nuevas listas para ello.

En general se suele decir que Lisp es un lenguaje de programación programable.

Durante la carrera tuve que aprender Lisp y recuerdo que me gustaba mucho. Con este post comienzo un mini curso de Lisp basándome en los apuntes de aquellos años.