<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5110914895748652921</id><updated>2011-07-08T01:09:23.056+02:00</updated><title type='text'>Algo pasa con Lisp</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-5048919705926673240</id><published>2009-10-07T10:33:00.003+02:00</published><updated>2009-10-07T10:37:09.215+02:00</updated><title type='text'>La ciencia en España no necesita tijeras</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_42jbWnjfQPk/SsxTCW7AWfI/AAAAAAAAACE/nZF6OPQ0wD4/s1600-h/cienciaEspana.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_42jbWnjfQPk/SsxTCW7AWfI/AAAAAAAAACE/nZF6OPQ0wD4/s320/cienciaEspana.jpg" alt="" id="BLOGGER_PHOTO_ID_5389774154033551858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hola a todos:&lt;br /&gt;&lt;br /&gt;Como ya sabréis, los presupuestos españoles para el año 2010 contemplan una reducción muy importante del dinero destinado a la ciencia en España. Desde este humilde blog quiero unirme a la campaña lanzada por la aldea irreductible en contra de esta reducción de fondos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-5048919705926673240?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/5048919705926673240/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=5048919705926673240' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/5048919705926673240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/5048919705926673240'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2009/10/la-ciencia-en-espana-no-necesita.html' title='La ciencia en España no necesita tijeras'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_42jbWnjfQPk/SsxTCW7AWfI/AAAAAAAAACE/nZF6OPQ0wD4/s72-c/cienciaEspana.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-3386181012510350752</id><published>2009-01-26T08:58:00.011+01:00</published><updated>2009-04-03T09:36:12.087+02:00</updated><title type='text'>Primeros pasos con LTK (parte 4)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hola de nuevo:&lt;br /&gt;&lt;br /&gt;Hoy vamos a hablar sobre cómo hacer que nuestras aplicaciones en LTK respondan a estímulos del mundo exterior. Exacto! Vamos a hablar de la gestión de eventos.&lt;br /&gt;&lt;br /&gt;Aquellos que no hayáis programado nunca una aplicación gráfica seguramente os estáis preguntando qué es esto de los eventos.  Bien. Una aplicación gráfica normalmente no está haciendo cosas todo el tiempo, sino que se espera a que pase algo y en ese momento responde. Por ejemplo, al hacer click en el botón "actualizar", firefox actualizará la página web que estáis viendo en este momento. Antes de pulsar el botón, firefox no está haciendo nada. Cuando pulsáis el botón, la librería gráfica le dice a firefox "oye, que el chaval este ha &lt;span style="font-style: italic;"&gt;pulsao&lt;/span&gt; un botón, haz algo" y firefox responde desperezándose y renovando la página. Ese algo que ha provocado la reacción del programa ( en nuestro caso, la pulsación de un botón ) se llama evento. Podríamos decir que un esquema bastante general de una aplicación gráfica sería el siguiente:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;La aplicación arranca.&lt;/li&gt;&lt;li&gt;La aplicación se queda esperando que suceda un evento.&lt;/li&gt;&lt;li&gt;Sucede un evento. La aplicación actúa según qué evento sea.&lt;/li&gt;&lt;li&gt;Una vez finalizada la respuesta al evento, la aplicación vuelve a esperar que suceda un nuevo evento.&lt;/li&gt;&lt;li&gt; ...&lt;/li&gt;&lt;li&gt;Sucede algo que hace que la aplicación decida terminar.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Hoy aprenderemos a gestionar algunos eventos básicos en nuestras aplicaciones.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;La función bind&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La manera que tiene LTK de gestionar eventos es particularmente simple. Lo que hacemos es vincular un evento con un determinado widget y una función, de manera que cuando ese evento le suceda a ese widget será esa la función que se ejecute. En algunos toolkits gráficos lo que se envía es un evento junto con el widget que lo ha provocado y nos las tenemos que apañar para decidir cómo actuar. Afortunadamente, en LTK esto no es así ( como en la mayoría de toolkits gráficos actuales, tendría que añadir. Aquellos malos tiempos ya pasaron, a no ser que queráis hacer algo de muy bajo nivel ).&lt;br /&gt;&lt;br /&gt;La manera de hacer lo que hemos dicho es mediante la función bind. Su formato es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;span style="font-weight: bold;"&gt;bind&lt;/span&gt; widget nombreEvento FuncionAEjecutar )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo, vamos a hacer que al hacer click sobre una etiqueta se ejecute una función, de forma que imitaremos un botón. Sí, bueno, ya tenemos botones, pero recordad que estamos aprendiendo, así que empezaremos por algo sencillo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;NOTA: los nombres de los eventos se deben cerrar entre &lt;&gt;. Por alguna extraña razón, blogger no me deja.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un trozo de código lisp que nos crearía la interfaz sería&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(use-package :ltk )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(with-ltk ()&lt;br /&gt;(let&lt;br /&gt;    (&lt;br /&gt;     (etiqueta (make-instance 'label :master nil  :text "Etiqueta" ))&lt;br /&gt;     )&lt;br /&gt;  (pack etiqueta )&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;Ahora simplemente vamos a añadir una línea para que la etiqueta muestre por pantalla "Hola" cuando le hagamos click encima. Esta línea sería la siguiente:&lt;br /&gt;&lt;br /&gt;(bind etiqueta "Button-1" (lambda (x) (print 'hola )))&lt;button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;Los eventos en LTK se nombran mediante cadenas de texto. Por ejemplo, "&lt;button-1&gt;" identifica la pulsación del botón izquierdo del ratón. Hay muchos otros eventos, y además se admiten abreviaciones.  La función que asignamos necesita un argumento porque se le pasa un objeto de tipo evento que en este ejemplo no necesitamos usar. Nuestro código final sería, pues:&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;(use-package :ltk )&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;(with-ltk ()&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt; (let&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;     (&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;      (etiqueta (make-instance 'label :master nil  :text "Etiqueta" ))&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;      )&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;   (bind etiqueta "&lt;button-1&gt;Button-1" (lambda (x) (print 'hola )))&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;   (pack etiqueta )&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;   )&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt; )&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;Podemos ver el resultado de pulsar 3 veces encima de la etiqueta:&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;br /&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_42jbWnjfQPk/SdW3PpZDZHI/AAAAAAAAAB0/lQCjdcfWioc/s1600-h/ltk4_1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_42jbWnjfQPk/SdW3PpZDZHI/AAAAAAAAAB0/lQCjdcfWioc/s320/ltk4_1.png" alt="" id="BLOGGER_PHOTO_ID_5320360014244963442" border="0" /&gt;&lt;/a&gt;Ahora pasaremos a ver cómo conseguir que los widgets cambien de color en cuanto les pasamos el ratón por encima. Así podemos consiguir efectos muy bonitos si elegimos los colores con gusto. Hay otras formas más sencillas de hacerlo, pero nos vamos a olvidar de ellas. Probad el siguiente ejemplo:&lt;br /&gt;&lt;br /&gt;(with-ltk ()&lt;br /&gt; (let&lt;br /&gt;     (&lt;br /&gt;      (etiqueta (make-instance 'label :master nil  :text "Etiqueta" :background "gray"  ))&lt;br /&gt;      )&lt;br /&gt;   (bind etiqueta "&lt;enter&gt;Enter" (lambda (x) (configure etiqueta :background "green" )))&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;    (bind etiqueta "&lt;leave&gt;Leave" (lambda (x) (configure etiqueta :background "gray" )))&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;    (pack etiqueta )&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;    )&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;  )&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;Es sencillo entenderlo. Simplemente creamos una etiqueta con el fondo gris, usando la opción background. Entonces le asociamos dos eventos:&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;ol&gt;&lt;li&gt;Cuando el ratón entre al widget, reconfiguramos la etiqueta para que tenga el fondo verde.&lt;/li&gt;&lt;li&gt;Cuando el ratón se retire de la etiqueta, la reconfiguramos para que vuelva a tener el fondo gris.&lt;/li&gt;&lt;/ol&gt;De esta forma conseguimos el efecto de destacar la etiqueta. Desgraciadamente no tengo buen gusto para los colores :-)&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;Os dejo un enlace a un tutorial de la Universidad de Oviedo dónde podéis encontrar una lista con algunos eventos y algo más de información sobre ellos:&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;a href="http://www6.uniovi.es/tcl/tutorial/cap12.html"&gt;http://www6.uniovi.es/tcl/tutorial/cap12.html&lt;/a&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;Por hoy ya tenemos suficiente.&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;He de pediros disculpas por no haber escrito nada durante mucho tiempo. He tenido que examinarme del máster y no he podido hacer nada más, pero espero poder escribir más a menudo a partir de ahora.&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;Nos vemos!&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;span style="font-style: italic;"&gt;PD: me gustaría programar un pequeño juego en ltk como programa final, para cuando haya acabado el curso. Si queréis proponerme algo, escribidlo como comentario en esta entrada. Yo había pensando en un tres en ralla, un buscaminas o algo similar. Pensad que debe ser algo que se pueda explicar en un máximo de 2 o 3 posts. Agradeceré vuestras sugerencias.&lt;/span&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;leave&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/button-1&gt;&lt;/leave&gt;&lt;/enter&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-3386181012510350752?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/3386181012510350752/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=3386181012510350752' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/3386181012510350752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/3386181012510350752'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2009/01/primeros-pasos-con-ltk-parte-4.html' title='Primeros pasos con LTK (parte 4)'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_42jbWnjfQPk/SdW3PpZDZHI/AAAAAAAAAB0/lQCjdcfWioc/s72-c/ltk4_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-246798618322305119</id><published>2008-12-20T22:22:00.008+01:00</published><updated>2009-01-16T08:36:31.656+01:00</updated><title type='text'>Scripting en lisp</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hola:&lt;br /&gt;&lt;br /&gt;Quería escribir esta entrada para comentar algo que me ha sucedido recientemente y que viene al caso de la utilidad de lisp para escribir scripts para la administración de sistemas, al estilo de lo que se suele hacer en perl.&lt;br /&gt;&lt;br /&gt;Veamos la situación: recientemente me compré un Acer Aspire One ZG5 con Linux Linpus preinstalado.  Por circunstancias que no vienen al caso tuve que cambiar el sistema operativo para poner Debian el Pc. Pues bien, el problema fue que quise instalar un entorno gráfico ligero ( WindowMaker ) en el cuál pretendía usar wicd para configurar mi red inalámbrica. Para mi sorpresa, wicd no funcionó. Lejos de suponer un problema, configuré la red editando manualmente el archivo /etc/network/interfaces y obtuve conexión a internet.  Esto sucedió en el trabajo.&lt;br /&gt;&lt;br /&gt;Al llegar a mi casa, más de lo mismo. Wicd no conectaba a mi red wireless y tuve que crear un nuevo archivo de configuración para mi red casera. Resumiendo: la situación era la siguiente:  2 archivos de configuración (/etc/network/interfaces.wep y /etc/network/interfaces.wpa ) y un enlace simbólico al archivo correcto que debía crear manualmente cada vez que quería cambiar de red, además de llamar  al dichoso /etc/init.d/networking restart cada vez, para conectar.&lt;br /&gt;&lt;br /&gt;Aunque no es algo excesivamente tedioso, enseguida pensé en escribir un script que automatizara el proceso de conectar a la red que quisiera, y se me ocurrió escribirlo en lisp en lugar de hacer el típico shell script.  La idea era crear un pequeño programa que borrara el enlace existente, substituyéndolo por un nuevo enlace al archivo de configuración correcto y luego llamara a /etc/init.d/networking restart para conectarme a la red. No parecía difícil hacerlo en lisp, pues.&lt;br /&gt;&lt;br /&gt;Para ejecutar procesos del linux desde lisp necesitamos la función (escribí esto para sbcl, no debería ser difícil reescribirlo para cualquier otro lisp) (sb-ext:run-program programa lista_de_argumentos ) . Si queremos llamar a la función sin argumentos, simplemente usaremos como segundo parámetro la lista vacía (nil).&lt;br /&gt;&lt;br /&gt;Ahora nuestro programa debería ser como sigue:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Función activar_conexion &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   Parámetros: nombre de la conexion a activar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Ejecuta rm -f /etc/network/interfaces&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Ejecuta ln -s /etc/network/nombre_archivo_configuracion /etc/network/interfaces&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Ejecuta  /etc/init.d/networking restart&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;El resto del programa debía consistir en algo de código para guardar los nombres de los archivos de configuración. Ahí se me ocurrió la idea de hacer un programa gráfico que usara ltk. Me mostraría todos los archivos de configuración de que dispongo y yo sólo tendría que clickear en un botón para activar la conexión a internet.&lt;br /&gt;&lt;br /&gt;Finalmente, decidí que mantendría una tabla hash llamada *conexiones* con entradas del tipo ( nombre fichero_configuracion ) dónde guardaría las conexiones de que dispongo, y que el procedimiento anadir-conexion me serviría para añadir entradas a la hash. Una vez hecho click en el botón correspondiente la función activar-conexion me activaría la conexión a internet haciendo lo que hemos dicho antes.&lt;br /&gt;&lt;br /&gt;Pues bien, aquí tenéis el código fuente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(require :ltk )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(use-package :ltk )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(defvar *directorio-base* "/etc/network/" )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(defvar *nombre-link* "/etc/network/interfaces" )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(defvar *conexiones* (make-hash-table :test 'equal ))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(defun anadir-nueva-conexion ( nombre nombre_arxivo )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  (setf (gethash nombre *conexiones* ) nom_arxivo )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(defun activar-conexion ( nombre )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  (if (gethash nombre *conexiones* )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      (progn&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    (let&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         (nombre_arxivo (concatenate 'string *directorio-base* (gethash nombre *conexiones* )))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      (print nombre_arxivo )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      (sb-ext:run-program "/bin/rm" (list "-f" *nombre-link* ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      (sb-ext:run-program "/bin/ln" (list "-s" nombre_arxivo *nombre-link* ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      (sb-ext:run-program "/etc/init.d/networking" (list "restart" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(anadir-nueva-conexion "Eduroam UV" "interfaces.wpa" )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(anadir-nueva-conexion "Red casa" "interfaces.wep" )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(defun main ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  (setq *wish-args* (list "-name" "NetworkSwitcher" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  (with-ltk ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    (let*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     (marco (make-instance 'frame :master nil ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     etiqueta&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      (maphash (lambda (key value )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         (declare (ignore value ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         (setq etiqueta (make-instance 'button :master marc :width 12 :text key&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                           :command (lambda ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                              (print key )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                              (activar-conexion key ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                           ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         (pack etiqueta )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;         )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           *conexiones* )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      (pack marco )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;      )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(main)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Al arrancar el programa se ven 2 botones, uno con la etiqueta "Red casa" y otro con la etiqueta "Eduroam UV". Al hacerles click activo la red correspondiente.&lt;br /&gt;&lt;br /&gt;Sencillo, no? Mucha gente pensará que debería leerme la faq de wicd en lugar de perder el tiempo en estas cosas, pero realmente he aprendido y disfrutado haciéndolo, así que me doy por satisfecho.&lt;br /&gt;&lt;br /&gt;Adiós!!! Felices fiestas a todos!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-246798618322305119?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/246798618322305119/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=246798618322305119' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/246798618322305119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/246798618322305119'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/12/scripting-en-lisp.html' title='Scripting en lisp'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-8379897109750933662</id><published>2008-11-27T09:15:00.022+01:00</published><updated>2008-12-19T09:46:37.564+01:00</updated><title type='text'>Primeros pasos con LTK (parte 3)</title><content type='html'>&lt;span style="font-weight: bold;font-size:180%;" &gt;A vueltas con el pack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hoy vamos aprender a colocar nuestros widgets en la pantalla. Quizás no sea un tema muy atractivo, pero sí es absolutamente necesario, así que pongámonos manos a la obra.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Vamos a empezar por crear unas cuantas etiquetas que iremos posicionando de distintas maneras.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(let&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(marco (make-instance 'frame :master nil ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El código de arriba nos crea las etiquetas pero no se ocupa de posicionarlas en la pantalla. Es ahora cuando entra en juego el pack. Empecemos por ver cómo las posiciona por defecto:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(with-ltk ()&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(let*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(marco (make-instance 'frame :master nil ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" ))&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack marco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack  etiqueta1 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta2 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta3 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta4 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Por defecto, pack coloca los widgets de arriba a abajo. El resultado del código anterior es lo siguiente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_42jbWnjfQPk/SUtWAzStsDI/AAAAAAAAAA8/ndhhuedj-u8/s1600-h/exemple1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_42jbWnjfQPk/SUtWAzStsDI/AAAAAAAAAA8/ndhhuedj-u8/s320/exemple1.png" alt="" id="BLOGGER_PHOTO_ID_5281409559790727218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Es importante darse cuenta de que LTK no muestra los widgets  en el orden en que fueron creados, sino en el orden en que se llama a pack. En el ejemplo anterior, ha puesto arriba a etiqueta1 porque ha sido la primera con la que hemos llamado a pack, pero podríamos hacerlo de cualquier otra manera:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(let*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(marco (make-instance 'frame :master nil ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" ))&lt;br /&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack marco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack  etiqueta4 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta2 )&lt;br /&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(pack etiqueta1 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta3 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;y el resultado sería que los widgets se muestran en otro orden, que no tiene nada que ver con el orden en el que fueron creados:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_42jbWnjfQPk/SUtWpDZytBI/AAAAAAAAABE/elGHodsLzL0/s1600-h/exemple2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://4.bp.blogspot.com/_42jbWnjfQPk/SUtWpDZytBI/AAAAAAAAABE/elGHodsLzL0/s320/exemple2.png" alt="" id="BLOGGER_PHOTO_ID_5281410251310150674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora vamos a situar los widgets lateralmente. Para ello sólo debemos hacer uso de la opción&lt;span style="font-style: italic;"&gt; :side&lt;/span&gt; del pack. Veamos un ejemplo:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(with-ltk ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(let*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(marco (make-instance 'frame :master nil ))&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" ))&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack marco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack  etiqueta1 :side :left)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta2 :side :left)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta3 :side :left)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta4 :side :left)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El resultado es que los widgets se situan de izquierda a derecha:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtXiR8mF7I/AAAAAAAAABM/3DVTzuPH9wY/s1600-h/exemple3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtXiR8mF7I/AAAAAAAAABM/3DVTzuPH9wY/s320/exemple3.png" alt="" id="BLOGGER_PHOTO_ID_5281411234466764722" border="0" /&gt;&lt;/a&gt;También podemos situarlos de derecha a izquierda usando &lt;span style="font-style: italic;"&gt;:side :right&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(with-ltk ()&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(let*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(marco (make-instance 'frame :master nil ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack marco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack  etiqueta1 :side :right)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta2 :side :right)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta3 :side :right)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta4 :side :right)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Fijáos cómo la etiqueta1 ahora está a la derecha:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtYATVy6xI/AAAAAAAAABU/rB17oFUr43o/s1600-h/exemple4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtYATVy6xI/AAAAAAAAABU/rB17oFUr43o/s320/exemple4.png" alt="" id="BLOGGER_PHOTO_ID_5281411750236973842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Por último, veremos cómo poner las etiquetas de abajo a arriba. Esto no suele ser muy útil porque es lo mismo que ponerlas de arriba a abajo llamando a pack en orden inverso, pero lo pongo por completitud. Se hace justo como suponéis, usando &lt;span style="font-style: italic;"&gt;:side :bottom&lt;/span&gt;:&lt;br /&gt;&lt;/div&gt; &lt;span style="font-style: italic;"&gt;(with-ltk ()&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(let*&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(marco (make-instance 'frame :master nil ))&lt;br /&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack marco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack  etiqueta1 :side :bottom)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta2 :side :bottom)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta3 :side :bottom)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack etiqueta4 :side :bottom)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtYwsfVdxI/AAAAAAAAABc/1K33hPYAzX4/s1600-h/exemple5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtYwsfVdxI/AAAAAAAAABc/1K33hPYAzX4/s320/exemple5.png" alt="" id="BLOGGER_PHOTO_ID_5281412581621593874" border="0" /&gt;&lt;/a&gt;Esto es todo lo que veremos hoy sobre pack. Con lo que ya sabéis podéis crear interfaces complicadas. ¿Cómo? Solamente habéis de crear marcos y meter los widgets en ellos en el orden adecuado. En el capítulo sobre el widget frame veremos como hacer esto.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;El grid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Aunque en principio no pensaba tratarlo, voy a hablar un poco sobre grid. Es un geometry manager distinto a pack. No deben mezclarse pack y grid en el mismo marco porque podemos crear un pequeño desastre con la colocación de los widgets. De todas formas, grid es útil porque lo que hace es situar los widgets en una cuadrícula, de forma que nos simplifica la vida en aplicaciones tipo hojas de cálculo y similares. Su sintaxis básica es muy sencilla:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid widget fila columna)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Fila y columna son enteros, representan el número de fila y columna (lógico). La primera fila es la 0, al igual que la primera columna. Veamos cómo situar nuestras 4 etiquetas en una rejilla 2x2:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(with-ltk ()&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(let*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(marco (make-instance 'frame :master nil ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" ))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack marco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid  etiqueta1 0 0)&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;(grid etiqueta2 0 1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid etiqueta3 1 0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid etiqueta4 1 1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El resultado es el esperado:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_42jbWnjfQPk/SUtbQVIjFGI/AAAAAAAAABk/AcF18zUHy2U/s1600-h/exemple6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_42jbWnjfQPk/SUtbQVIjFGI/AAAAAAAAABk/AcF18zUHy2U/s320/exemple6.png" alt="" id="BLOGGER_PHOTO_ID_5281415324131071074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para finalizar os voy a enseñar un pequeño truco. Si os fijáis en el ejemplo anterior, no se distinguen unas etiquetas de las otras. Eso es porque no tienen relieve. Pues bien, vamos a añadirlo! Todo widget tiene una opción llamada :relief que puede tomar varios valores. Os pongo un código de ejemplo y tratad de averiguar que hace:&lt;br /&gt;&lt;/div&gt; &lt;span style="font-style: italic;"&gt;(with-ltk ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(let*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(marco (make-instance 'frame :master nil ))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(etiqueta1 (make-instance 'label :master marco :text "Etiqueta 1" &lt;/span&gt;&lt;span style="font-style: italic;"&gt;:relief :sunken&lt;/span&gt;&lt;span style="font-style: italic;"&gt;))&lt;br /&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(etiqueta2 (make-instance 'label :master marco :text "Etiqueta 2" &lt;/span&gt;&lt;span style="font-style: italic;"&gt;:relief :sunken&lt;/span&gt;&lt;span style="font-style: italic;"&gt;))&lt;br /&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(etiqueta3 (make-instance 'label :master marco :text "Etiqueta 3" &lt;/span&gt;&lt;span style="font-style: italic;"&gt;:relief :sunken&lt;/span&gt;&lt;span style="font-style: italic;"&gt;))&lt;br /&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(etiqueta4 (make-instance 'label :master marco :text "Etiqueta 4" &lt;/span&gt;&lt;span style="font-style: italic;"&gt;:relief :sunken&lt;/span&gt;&lt;span style="font-style: italic;"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(pack marco)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid  etiqueta1 0 0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid etiqueta2 0 1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid etiqueta3 1 0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(grid etiqueta4 1 1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtb2r0duqI/AAAAAAAAABs/V4NwmwUKEeU/s1600-h/exemple7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_42jbWnjfQPk/SUtb2r0duqI/AAAAAAAAABs/V4NwmwUKEeU/s320/exemple7.png" alt="" id="BLOGGER_PHOTO_ID_5281415983055878818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hemos hundido las etiquetas, de forma que la separación entre ellas queda visible. Se pueden hacer cosas más bonitas :-)&lt;br /&gt;&lt;br /&gt;Nos vemos en el próximo post!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-8379897109750933662?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/8379897109750933662/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=8379897109750933662' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/8379897109750933662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/8379897109750933662'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/11/primeros-pasos-con-ltk-parte-3.html' title='Primeros pasos con LTK (parte 3)'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_42jbWnjfQPk/SUtWAzStsDI/AAAAAAAAAA8/ndhhuedj-u8/s72-c/exemple1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-4081154984662332430</id><published>2008-11-05T09:17:00.002+01:00</published><updated>2008-11-05T09:18:23.791+01:00</updated><title type='text'>Primeros pasos con LTK (parte 2)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hola!&lt;br /&gt;&lt;br /&gt;Hoy vamos a seguir con la introducción a LTK que iniciamos hace unos días.&lt;br /&gt;&lt;br /&gt;Empezaremos por comentar el ejemplo que ya vimos y que nos mostraba "Hola, mundo" en una etiqueta:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;(use-package :ltk )&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;(with-ltk ()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;(let&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;  ( etiqueta (make-instance 'label :master nil :text "Hola, mundo" ))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;(pack etiqueta)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien. La primera línea es conocida: (use-package :ltk) simplemente importa los símbolos que necesitamos, para no tener que escribir todo el rato ltk:laFuncionQueNosInteresa.&lt;br /&gt;&lt;br /&gt;Es en la segunda línea donde empezamos a usar ltk. La macro with-ltk inicializa la librería y ejecuta todo el código que metemos en su cuerpo. Tiene unos parámetros opcionales ( en nuestro caso, la lista vacía --()-- ) que nos permiten controlar ciertas opciones de debug.&lt;br /&gt;&lt;br /&gt;Cada tipo de widget en ltk se representa mediante una clase. Por eso, cuando llamamos a make-instance 'label estamos creando una etiqueta. Todos los widgets de ltk tienen unas opciones de inicialización comunes:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;master : el widget padre. Si lo dejamos a nil, ltk tomará a este widget como del nivel padre&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Pack es lo que se llama un "package manager", o gestor de empaquetado. Es la función que usamos cuando queremos situar un widget sobre la pantalla, y se encarga de tareas como su posición relativa a otros widgets y (en ocasiones) su tamaño. Existen varios package managers, pero pack es el más utilizado, así que será el que comentaremos aquí. Si queréis saber más sobre el resto de managers, una forma fácil de empezar es &lt;span style="font-style: italic;"&gt;man grid&lt;/span&gt; o man place.&lt;br /&gt;&lt;br /&gt;Cuando trabajamos con pack lo que hacemos es situar los widgets en cajas. Podemos elegir si situaremos estas cajas de arriba a abajo ( por defecto en pack ), de abajo a arriba, de izquierda a derecha o de derecha a izquierda. También nos permite elegir si queremos que el widget se vea elevado sobre la caja, hundido o de diversas formas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;El widget label ( la etiqueta )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El widget label es uno de los más básicos y sencillos de utilizar. Simplemente es una etiqueta donde podemos mostrar texto.&lt;br /&gt;&lt;br /&gt;La forma más común de crear un label es mediante&lt;br /&gt;&lt;br /&gt;(make-instance 'label :master suPadre :text "SuTexto"  )&lt;br /&gt;&lt;br /&gt;Esto ajustará automáticamente el tamaño de la etiqueta al del texto que contiene.&lt;br /&gt;&lt;br /&gt;A veces resulta muy conveniente, a fin de realizar interfaces más bonitas, controlar el ancho de las etiquetas para que todas tengan el mismo tamaño. Esto se hace mediante la opción de inicialización :width suAncho , dónde suAncho es un entero. El ancho de un label se mide en carácteres, por tanto :width 10 significará que queremos una etiqueta con un ancho de 10 carácteres.&lt;br /&gt;&lt;br /&gt;Evidentemente, hay muchas más opciones interesantes para los label. &lt;span style="font-style: italic;"&gt;man label&lt;/span&gt; para verlas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;El widget button ( el botón )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El widget button ofrece lo que promete: un botón. Su inicialización es muy similar a la del widget label, excepto por el hecho de que nos deja proporcionarle un argumento command que es la función que ejecutará cuando sea pulsado.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;(make-instance 'button :master nil :text "Pulsame"&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;:command ( lambda ()&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; (format t "Has pulsado el boton~%" )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;A ver si imagináis que hace el código anterior.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-4081154984662332430?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/4081154984662332430/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=4081154984662332430' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/4081154984662332430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/4081154984662332430'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/11/primeros-pasos-con-ltk-parte-2.html' title='Primeros pasos con LTK (parte 2)'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-6396107619087773852</id><published>2008-10-15T09:47:00.008+02:00</published><updated>2008-10-15T10:38:07.713+02:00</updated><title type='text'>Dibujando gráficas en 2 patadas con CGN</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_42jbWnjfQPk/SPWpphLm8jI/AAAAAAAAAAc/GcJKQytCf3s/s1600-h/easy-plotter.JPG"&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Hola:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Sí, el título podía ser más formal, pero hoy nos interesa ir deprisa...&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Vamos a aprender a dibujar gráficas en Gnuplot desde lisp. Gnuplot es un conocido programa para dibujar gráficas de funciones y puntos (las últimas versiones hacen más cosas, como por ejemplo histogramas) que seguramente ya conoceréis. Así que manos a la obra!&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Existen muchas alternativas en lo que a controlar gnuplot desde lisp se refiere. En &lt;/span&gt;&lt;a href="http://www.cliki.net/Common%20Lisp%20and%20gnuplot"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;cliki&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; podéis encontrarlas. Aquí me limitaré a enseñaros a dibujar con CGN. ¿ Por qué CGN? Pues porque soy su autor, así que es la librería que mejor conozco y la que suelo usar, aunque no la mejor. Os invito a que probéis el resto y me contéis cómo ha sido la experiencia. Podemos publicarlo en este blog para ayudar a más gente.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;¿Cómo instalaremos CGN? Pues de la manera que os imagináis: &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(asdf-install:install 'cgn )&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;CGN depende de la librería gráfica LTK, así que asdf-install la instalará por vosotros. Ahora bien, para este tutorial os recomiendo usar la versión que se halla en el &lt;/span&gt;&lt;a href="http://common-lisp.net/project/nixies/cgn_snapshot.tar.gz"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;repositorio darcs, &lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; que se debe instalar a mano. La función plot2d que usaremos aquí sólo se encuentra en esa versión. Lo siento, todavía no he lanzado una release actualizada.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Dibujando con plot2d:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Para empezar a dibujar con CGN sólo hay que saber usar 2 cosas: la macro with-gnuplot y la función plot2d. &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Empecemos por la macro: para dibujar con CGN hay que escribir el código dentro de la macro &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(with-gnuplot () &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;;;Código aquí&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;No nos interesa ahora lo que podemos ponerle como argumento. ¡Queremos empezar a dibujar, ya! Pues bien: aquí está lo más sencillo y útil que le podemos poner como argumento: plot2d.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Plot2d es una función que pretende ofrecer la funcionalidad que proporciona el comando del mismo nombre en &lt;/span&gt;&lt;a href="http://maxima.sourceforge.net/"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Maxima&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.  Su sintaxis básica es :&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(plot2d quePlotear rangoX &amp;amp;rest opciones )&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;rangoX ha de ser una lista con el formato ( 'x xminimo xmaximo ). quePlotear puede ser muchas cosas: un string ( "sin(x)" ) , una función ( #'cos ) , una lambda function, una lista de puntos o una lista conteniendo todo lo anterior. De las opciones no hablaremos de momento, hay prisa!&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Por ejemplo, mostramos el seno:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(with-gnuplot () &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;   (cgn::plot2d "sin(x)" '(x 0 10 ) ) )&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); "&gt;&lt;img src="http://3.bp.blogspot.com/_42jbWnjfQPk/SPWpqdMmigI/AAAAAAAAAA0/djNW-VSAsKk/s320/exempleSinus.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5257294686882007554" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Si le pasamos una función, CGN la dibujará en los puntos que crea necesario:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(with-gnuplot ()&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;   (cgn::plot2d #'cos '(x 0 10 ) ) )&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_42jbWnjfQPk/SPWpp2nesAI/AAAAAAAAAAk/aCdypiPVNnw/s1600-h/exempleFunction.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_42jbWnjfQPk/SPWpp2nesAI/AAAAAAAAAAk/aCdypiPVNnw/s320/exempleFunction.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5257294676525756418" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_42jbWnjfQPk/SPWppyPlGfI/AAAAAAAAAAs/F1wy0vGG8-Q/s1600-h/exempleScatter.JPG"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Otra opción es hacer un gráfico de puntos:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(with-gnuplot ()&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;  (cgn::plot2d '(discrete (1 2 3 4 5 6 7 8 9 10 ) (1.1 2.5 4.21 2.12 3.15 4.57 6.87 8.74 12.5 13.4789 ) ) '(x 0 10 ) ) &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_42jbWnjfQPk/SPWppyPlGfI/AAAAAAAAAAs/F1wy0vGG8-Q/s1600-h/exempleScatter.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_42jbWnjfQPk/SPWppyPlGfI/AAAAAAAAAAs/F1wy0vGG8-Q/s320/exempleScatter.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5257294675351771634" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_42jbWnjfQPk/SPWpqdMmigI/AAAAAAAAAA0/djNW-VSAsKk/s1600-h/exempleSinus.JPG"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Podéis ver una muestra de lo que plot2d puede hacer ejecutando (cgn::plot2d-test). En el manual en pdf que se incluye en la versión de desarrollo se explica todo.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;La forma rápida y simple&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Existe una forma para que hasta un niño pueda hacer gráficas en CGN. Consiste en usar  el easy-plotter. Easy-plotter es una interfaz gráfica escrita en ltk para la macro plot (sí, esto también es una novedad de la versión del repositorio) que nos permite escribir simplemente la función que usaremos y plotearla. Lamentablemente, no sirve para plotear funciones de lisp ni lambda functions, pero es muy sencilla de usar:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(cgn::easy-plotter)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_42jbWnjfQPk/SPWpphLm8jI/AAAAAAAAAAc/GcJKQytCf3s/s1600-h/easy-plotter.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_42jbWnjfQPk/SPWpphLm8jI/AAAAAAAAAAc/GcJKQytCf3s/s320/easy-plotter.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5257294670771712562" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; " /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_42jbWnjfQPk/SPWpp2nesAI/AAAAAAAAAAk/aCdypiPVNnw/s1600-h/exempleFunction.JPG"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Parece sencillo, ¿verdad? Probadlo. CGN puede hacer muchas más cosas, pero me tengo que ir a clase, así que no hay tiempo para contarlas. Espero que esto os haya resultado útil. Ah! Por favor, la versión del repositorio está todavía en desarrollo, así que no seáis muy crueles con los fallos que encontréis. ¡Adiós!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-6396107619087773852?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/6396107619087773852/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=6396107619087773852' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/6396107619087773852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/6396107619087773852'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/10/dibujando-grficas-en-2-patadas-con-cgn.html' title='Dibujando gráficas en 2 patadas con CGN'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_42jbWnjfQPk/SPWpqdMmigI/AAAAAAAAAA0/djNW-VSAsKk/s72-c/exempleSinus.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-5223684595688202918</id><published>2008-10-04T16:01:00.003+02:00</published><updated>2008-10-05T09:57:04.266+02:00</updated><title type='text'>Bienvenidos, sobrelisp!</title><content type='html'>Desde aquí quiero dar la bienvenida a un blog hermano que ha sido creado recientemente , &lt;a href="http://sobrelisp.blogspot.com/"&gt;sobrelisp.blogspot.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;David y yo esperamos que estos dos blogs se complementen para impulsar lisp en la comunidad hispanohablante.&lt;br /&gt;&lt;br /&gt;Buena suerte!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-5223684595688202918?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/5223684595688202918/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=5223684595688202918' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/5223684595688202918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/5223684595688202918'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/10/bienvenidos-sobrelisp.html' title='Bienvenidos, sobrelisp!'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-2027933155782572504</id><published>2008-09-18T11:09:00.007+02:00</published><updated>2008-09-27T09:24:50.964+02:00</updated><title type='text'>Cómo crear un entorno amigable para Lisp en Windows</title><content type='html'>¿Qué hay de nuevo?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hoy hablaremos de Lisp y Windows. No es este el mejor sistema operativo para usar Lisp. Tradicionalmente ha habido implementaciones de Lisp para Mac y Unix, aunque algunas compañías como &lt;a href="http://www.franz.com/"&gt;F&lt;/a&gt;&lt;a href="http://www.franz.com/"&gt;ranz&lt;/a&gt; ofrecen buenos compiladores de Lisp para Windows. Esta es una buenísima opción para todos aquellos que no tengan reparos en usar software propietario, puesto que la versión de evaluación de Allegro impone muy pocas limitaciones a los desarrolladores, junto con un gran IDE y un compilador rápido. Sin embargo, hoy hablaremos sobre cómo usar un Lisp libre como es &lt;a href="http://clisp.cons.org/"&gt;clisp&lt;/a&gt; sobre Windows sin dejarnos los nervios en el intento.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El entorno que instalaremos constará de clisp como intérprete de Lisp y emacs + slime como IDE. Muchos de vosotros ya conoceréis&lt;a href="http://www.gnu.org/software/emacs/"&gt; emacs&lt;/a&gt;, así que no hace falta presentarlo. &lt;a href="http://common-lisp.net/project/slime"&gt;Slime&lt;/a&gt; es un modo de interacción con emacs que permite ejecutar lisp desde un buffer de emacs y muchas otras cosas, como documentación en línea de funciones, inspector de objectos, compilación de archivos desde emacs y mucho más.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Empezaremos por instalar clisp. En &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=1355&amp;amp;package_id=1340"&gt;sourceforge&lt;/a&gt; podemos encontrar el último instalador para Windows, que mientras escribo este artículo es el clisp-2.46-win32-mingw-big.exe. Para instalarlo seguiremos el procedimiento estándar en Windows ( aceptar, aceptar, aceptar ...). Para finalizar, sólamente nos queda una comprobación: vamos al menú inicio -&gt; ejecutar y escribimos "clisp". Si está correctamente instalado veremos aparecer el REPL de clisp. Si no apareciera, desinstalamos clisp y instalamos una versión distinta. Que aparezca clisp de esta manera quiere decir que se ha instalado correctamente en el PATH. De no ser así, todavía se puede instalar emacs+slime, pero será más complicado, de manera que no voy a explicarlo ahora. Si a alguien le interesa que me lo haga saber en un comentario y se lo explicaré.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A continuación procedemos a instalar emacs. Podemos bajarlo desde &lt;a href="http://gnu.mirror.ironie.org/pub/gnu/emacs/windows/emacs-22.3-bin-i386.zip"&gt;aquí&lt;/a&gt;. He enlazado a la versión 22.3 porque, además de ser la última y mejor versión de emacs, tiene una bonita interfaz en GTK . Lo que bajaremos es un archivo comprimido en formato zip que habremos de descomprimir. Seguidamente crearemos la carpeta C:\emacs y copiaremos allí todo lo que hemos descomprimido, de manera que nos queden las carpetas C:\emacs\bin, C:\emacs\lisp, etc. Para poder usar emacs sólo nos queda crear un acceso directo en el escritorio al archivo C:\emacs\bin\runemacs.exe.&lt;br /&gt;&lt;br /&gt;Para finalizar habremos de instalar slime. Para ello descargamos la última snapshot de la cvs desde &lt;a href="http://common-lisp.net/cgi-bin/viewcvs.cgi/root.tar.gz?root=slime&amp;amp;view=tar"&gt;aquí&lt;/a&gt;. Una vez bajado, lo descomprimimos y copiamos el contenido de la carpeta que aparece a C:\, de manera que nos quede, por ejemplo, C:\slime\README, C:\slime\doc, etc... Una vez hecho esto, sólo queda decirle a emacs dónde encontrará a slime. Para ello, abrimos emacs y seleccionamos las opciones "Active region highlighting" i "Parent match highlighting". Estas opciones nos facilitaran editar código fuente en lisp. Seguidamente, guardamos las opciones haciendo click sobre Options -&gt; save options , y nos fijamos en el nombre de archivo que pone en el minibuffer. Esa es la ruta completa hasta el archivo de configuración de emacs. En mi pc, la ruta es C:\Documents and settings\nombre_usuario\Datos de programa\.emacs. Bien, ahora desde emacs abrimos ese archivo y añadimos las líneas siguientes:&lt;br /&gt;&lt;br /&gt;(add-to-list 'load-path "/slime/")  ; dónde hemos instalado slime&lt;br /&gt;   (setq inferior-lisp-program "clisp") ; nuestro lisp.&lt;br /&gt;   (require 'slime)&lt;br /&gt;   (slime-setup)&lt;br /&gt;&lt;br /&gt;Ya está. Ahora cerramos emacs y lo volvemos a abrir para que cargue los cambios en el fichero de configuración ( seguramente, hay otra manera más elegante de hacer esto, pero no la conozco) y ya podemos empezar a usar slime. Para arrancarlo, simplemente escribid "Alt - x " y cuando el minibuffer os pida que escribáis poned slime. Ahora pulsad enter y slime ya cargará.&lt;br /&gt;&lt;br /&gt;Podéis ver el resultado a continuación:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_42jbWnjfQPk/SN3cUNkMsQI/AAAAAAAAAAU/wDlR5gselkQ/s1600-h/emacs%2Bslime.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_42jbWnjfQPk/SN3cUNkMsQI/AAAAAAAAAAU/wDlR5gselkQ/s320/emacs%2Bslime.JPG" alt="" id="BLOGGER_PHOTO_ID_5250594980380848386" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eso es todo por hoy. Espero que con esto consigáis tener un entorno lisp decente en el que dar forma a vuestras ideas. Adew!&lt;br /&gt;&lt;/div&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-2027933155782572504?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/2027933155782572504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=2027933155782572504' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/2027933155782572504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/2027933155782572504'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/09/cmo-crear-un-entorno-amigable-para-lisp.html' title='Cómo crear un entorno amigable para Lisp en Windows'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_42jbWnjfQPk/SN3cUNkMsQI/AAAAAAAAAAU/wDlR5gselkQ/s72-c/emacs%2Bslime.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-95845072932709266</id><published>2008-09-17T10:00:00.010+02:00</published><updated>2008-09-17T12:59:43.425+02:00</updated><title type='text'>Primeros pasos con LTK ( parte 1 )</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hoy vamos a hablar de la creación de interfaces gráficas de usuario en Lisp. Hoy en día una buena interfaz es un requisito imprescindible para que un programa tenga éxito fuera del ámbito científico o puramente técnico. Pero además, para que el desarrollo del programa sea asumible por el programador, es preciso que el tiempo invertido en crear esa interfaz no sea excesivo.&lt;br /&gt;&lt;br /&gt;La librería por excelencia para crear interfaces gráficas en Lisp es LTK ( &lt;a href="http://www.peter-herth.de/ltk/"&gt;http://www.peter-&lt;/a&gt;&lt;a href="http://www.peter-herth.de/ltk/"&gt;herth.de/ltk/&lt;/a&gt; ). LTK es una creación de Peter Herth. Consiste en una tubería que transforma nuestro código lisp en código tcl que es ejecutado por el programa wish. Si no habéis entendido nada de la parrafada anterior, no os preocupéis. No es necesario entenderla para poder usarla, LTK es tremendamente sencilla de usar.&lt;br /&gt;&lt;br /&gt;Primeramente, hay que instalar LTK. Para ello habremos de seguir 2 pasos:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Instalamos el lenguaje de programación tcl/tk. Normalmente cualquier distribución de linux lo llevará instalado por defecto. Si no es así, instaladlo, usado apt-get, synaptic, yast, emerge o cualquier herramienta que use vuestra distribución. No es necesario instalar los paquetes de desarrollo.&lt;/li&gt;&lt;li&gt;Instalamos la librería LTK propiamente dicha. Para ello, si disponemos de asdf-install, sólo tendremos que entrar en lisp y teclear&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family:verdana;"&gt;(asdf-install:install 'ltk )&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Sólo tendremos que seguir las instrucciones que asdf-install nos irá dictando y ya tendremos LTK instalada.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nuestro primer programa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usar ltk es terriblemente fácil. Como muestra, veamos un primer programa que nos muestre el ya clásico "Hola, mundo" en una ventanita:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;(use-package :ltk )&lt;br /&gt;(with-ltk ()&lt;br /&gt;  (let&lt;br /&gt;       (&lt;br /&gt;          ( etiqueta (make-instance 'label :master nil :text "Hola, mundo" ))&lt;br /&gt;       )&lt;br /&gt;        (pack etiqueta)&lt;br /&gt;  )&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Veamos cómo nos ha quedado:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_42jbWnjfQPk/SNDh7TqTwhI/AAAAAAAAAAM/LeSb_LqSClk/s1600-h/etiqueta.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_42jbWnjfQPk/SNDh7TqTwhI/AAAAAAAAAAM/LeSb_LqSClk/s320/etiqueta.JPG" alt="" id="BLOGGER_PHOTO_ID_5246941974892888594" border="0" /&gt;&lt;/a&gt;Voilà! Aquí tenéis una pequeña screenshoot de LTK corriendo nuestro ejemplo en un Windows XP.&lt;br /&gt;&lt;br /&gt;No voy a extenderme hoy sobre que es lo que hace nuestro código. Habrá tiempo para eso. Sólo espero que lo que habéis visto haya despertado vuestro interés por la programación gráfica en Lisp usando LTK.&lt;br /&gt;&lt;br /&gt;Hasta la próxima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-95845072932709266?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/95845072932709266/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=95845072932709266' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/95845072932709266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/95845072932709266'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/09/primeros-pasos-con-ltk-parte-1.html' title='Primeros pasos con LTK ( parte 1 )'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_42jbWnjfQPk/SNDh7TqTwhI/AAAAAAAAAAM/LeSb_LqSClk/s72-c/etiqueta.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5110914895748652921.post-3276066307921249102</id><published>2008-09-16T17:09:00.000+02:00</published><updated>2008-09-16T18:07:43.182+02:00</updated><title type='text'>El inicio</title><content type='html'>Hola a todos desde lispinspain.blogspot.com!&lt;br /&gt;&lt;br /&gt;A partir de ahora intentaremos crear un blog dónde congregar a todos los programadores de lisp de habla hispana que, hasta el momento, no disponían de recursos en su idioma.&lt;br /&gt;&lt;br /&gt;Siempre se ha dicho que no existe una comunidad alrededor de lisp. Esto es cierto, pero no nos impide que creemos una. La falta de información en su idioma puede hacer que cualquier persona interesada en lisp se desanime a las primeras de cambio, cosa muy triste porque lisp es uno de los lenguajes de programación más antiguos que existen y a la vez uno de los más potentes.&lt;br /&gt;&lt;br /&gt;Bueno, chicos y chic@s. Espero que desde esta página se pueda animar a mucha gente a mirar a lisp con un poco menos de miedo.&lt;br /&gt;&lt;br /&gt;Nos vemos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5110914895748652921-3276066307921249102?l=lispinspain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lispinspain.blogspot.com/feeds/3276066307921249102/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5110914895748652921&amp;postID=3276066307921249102' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/3276066307921249102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5110914895748652921/posts/default/3276066307921249102'/><link rel='alternate' type='text/html' href='http://lispinspain.blogspot.com/2008/09/el-inicio.html' title='El inicio'/><author><name>SpanishLisper</name><uri>http://www.blogger.com/profile/17420824065847162680</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
