Iteraciones de orden superior sobre listas

(0 comentarios)

  1. reduce: Aplica una función a pares de elementos de una lista hasta dejarla en un solo valor.
    (defun reduce (f l base)
    (if (endp l)
    base
    (funcall f (car l) (reduce f (cdr l) base))))

  2. map: Aplica una función a cada elemento de una lista y devuelve una lista con el resultado de aplicar la función a cada elemento.
    (defun map (f l)
    (if (endp l)
    nil
    (cons (funcall f (car l)) (map f (cdr l)))))

  3. accumulate: Practicamente igual a reduce. Es recursión de cola, por lo que es mas eficiente que reduce.
    (defun accumulate (f l acum)
    (if (endp l)
    acum
    (accumulate f (cdr l) (funcall f acum (car l)))))

  4. filter: Verifica que los elementos de una lista cumplan una determinada condición, devolviendo los elementos que cumplen esa condición.
    (defun filter (p l)
    (if (endp l)
    nil
    (if (funcall p (car l))
    (cons (car l) (filter p (cdr l)))
    (filter p (cdr l)))))

  5. exists: Devuelve el primer elemento de la lista que verifique una determinada condición o falso si ninguna la cumple.
    (defun exists (p l)
    (if (endp l)
    nil
    (if (funcall p (car l))
    (car l)
    (exists p (cdr l)))))

  6. for-all: Devuelve true si todos los elementos de una lista cumplen una determinada condición.
    (defun for-all (p l)
    (if (endp l)
    t
    (if (funcall p (car l)) (for-all p (cdr l)) nil)))

  7. zip: Toma dos listas de igual longitud y devuelve la lista cuyo enésimo elemento es el resultado de aplicar la función pasada como parámetro a el elemento enésimo de cada lista.
    (defun zip (f l1 l2)
    (if (endp l1)
    nil
    (cons (funcall f (car l1) (car l2)) (zip f (cdr l1) (cdr l2)))))

Lisp: Argumentos a funciones

(1 comentario)

(defun nombre función (arg1argN) … )

arg1…argN son lo que se llaman argumentos regulares, los típicos de cualquier lenguaje de programación. En Lisp tenemos también lo que llamamos parámetros opcionales.

Argumentos opcionales
(defun nombre función (arg1argN &optional op1opN)

Se colocan siempre primero los argumentos regulares. Los valores que se pasan al llamar a esta función se ligan de izquierda a derecha a los nombres de los parámetros como en cualquier otro lenguaje. Si falta algún valor para opcionales el valor del opcional será nil.

Valores por defecto
(defun nombre función (arg1argN &optional (op1 valor1)opM))

Podemos darle un valor por defecto a un argumento opcional, de forma que si no se pasa un valor que se ligue a ese parámetro opcional en lugar de nil se tome como valor el valor por defecto. Para hacer esto como vemos se incluye en una lista el nombre del parámetro y su valor por defecto, que tiene que ser un valor fijo, no puede ser una expresión.

Flag de presencia
(defun nombre función (arg1argN &optional (op1 valor1 op1-provided) … opM) …

El flag de presencia evalua a nil si no se pasó un valor para ese parámetro opcional y true si si se le pasó. Nos puede servir por ejemplo en el caso en que el valor por defecto sea nil, en cuyo caso sin este flag no se podría diferenciar entre el caso en que no se especificara ningún valor para ese parámetro o que se especificara pero este fuera nil.

Campos clave
(defun nombre función (arg1argN &key clave1 … &key claveN) …

Es similar a los parámetros opcionales pero se le asocia un nombre. En el caso de que tenga muchos parámetros opcionales puedo utilizar los campos clave para asociar un nombre al parámetro opcional en la invocación de la función (en la llamada se usa con :nombre-clave, como si fuera una constante).
Por ejemplo sea el prototipo de la función:

(defun incrementar (n &key operacion &optional (i 1))

Se llamaría a la función asi:

(incrementar 5 :operacion ‘inc 7)

Campos clave con valor por defecto
(defun nombre función (arg1argN &key (clave1 valor) …)

Similar a los opcionales con valor por defecto, la única diferencia entre los argumentos opcionales y los campos clave es que al llamar a la función en los campos clave hay que incuir el nombre del campo.

Como último apunte, si no conocemos el número de parámetros que voy a tener se pueden usar los argumentos de resto:

(defun nombre función (arg1argN &key clave &optional opcional &rest largs)

Todos los parámetros que no se hallan ligado se introducirían en una lista llamada largs.

Depuración en Lisp

(0 comentarios)

  • (describe #’nombre funcion) Nos da una descripción completa de la función.
  • (describe objeto) Nos da una descripción de variables y otros símbolos.
  • (apropos nombre objeto) Devuelve las descripciones de los objetos relacionados con el que hemos buscado (por eso el apropos; a proposito de)
  • (dribble “nombre fichero”) Forma especial que hace que las iteraciones con Lisp se escriban en un fichero además de imprimirse por pantalla.
  • (dribble) Sin nombre de fichero hace que deje de escribirse en fichero las iteraciones.
  • (trace nombre funcion) Cuando se llama a esa función muestra las llamadas (solo de esa función, si se llama a otras funciones no las muestra)
  • (time forma) Devuelve el tiempo y la memoria usada para ejecutar esa forma.
  • (step expr) Ejecuta paso a paso una expresión y a cada paso abre la shell de depuración.

Estructuras condicionales en Lisp

(4 comentarios)

  • (if condición
    expr1
    expr2)
    En el caso de que condición sea cierto se evalua expr1, en caso contrario expr2.

    (if (< nota 5)
    ‘suspenso
    ‘aprobado)

  • (cond (cond1 expr1)
    (cond2 expr2)

    (t exprN))
    Equivalente a una serie de ifs, si se cumple cond1 se evalua expr1, si no, si cond2 es cierto se evalua expr2,… El t final es opcional y dado que se cumple siempre sería equivalente a un default en un switch de java

    (cond ((< nota 5) 'suspenso)
    ((< nota 7) 'aprobado)
    ((< nota 9) 'notable)
    ((< nota 10) 'sobresaliente)
    (t ‘error))

  • (case expresion
    (valor1 expr1)
    ((valor2 valor3) expr2)

    (otherwise expr))
    Equivalente a los switchs de Java. Si expresión evalua a valor1 se ejecuta expr1, si evalua a valor2 o valor3 (si puede evaluar a mas de un valor se colocan en una lista) se evalua expr2,… Otherwise es equivalente a default en los switchs de java, se ejecuta si no evalúa a ninguno de los demás.

    Nota: case evalua con eql!!!

    (case nota
    ((0 1 2 3 4) ‘Suspenso)
    (5 ‘Aprobado)
    (6 ‘Bien)
    ((7 8) ‘Notable)
    ((9 10) ‘Sobresaliente))

Borrar archivos .avi en XP

(72 comentarios)

De vez en cuando puedes tener algún problema para borrar un archivo avi en XP ya que el sistema operativo intenta hacer una previsualización del archivo antes de hacer ninguna otra cosa con el.

Hay dos formas de tratar con este problema; podemos abrir regedit (Inicio->ejecutar, escribimos regedit), movernos hasta la clave HKEY_CLASSES_ROOT\ SystemFileAssociations\.avi\shellex\PropertyHandler y borrar el valor que se encuentra en esta clave o podemos abrir una ventana de símbolo de sistema (Inicio->ejecutar, escribimos cmd) y borrarlo desde allí.

Sindicación RSS

(0 comentarios)

Hace poco tiempo que Blogger incluyo sindicación Atom y se espera que se incluya RSS dentro de poco. Mientras se puede conseguir sindicación RSS via Feedster.

Este sitio ya lo incluye como puede verse en la barra lateral 🙂

Sindicación RSS de Zootropo

La igualdad en Lisp

(0 comentarios)

  • = ¿Son iguales dos números?
  • eq ¿Los dos argumentos son el mismo objeto? E.d ¿se refieren a la misma posición de memoria?
  • eql ¿Los dos argumentos son el mismo objeto? o ¿son números del mismo tipo y con el mismo valor?
  • equal ¿La representación impresa de los dos argumentos es la misma?

Bloglines en tu navegador

(1 comentario)

Logo de BloglinesBloglines Tooklit es una extensión para Mozilla/Mozilla Firefox creada por Chad Everett que integra el notificador de Bloglines dentro de nuestro navegador.

Una vez instalada aparecerá el icono de bloglines en la esquina inferior izquierda del navegador. Un click con el botón derecho del ratón nos mostrará las preferencias, donde debemos indicar la cuenta de correo que usamos con Bloglines.

Quitar el banner de publicidad de blogger

(7 comentarios)

Leido en manu blog

Como me molesta bastante el banner de publicidad lo he quitado usando una miguita de CSS, añade a tus archivos respectivamente:

body {margin: -150px 0 0 0;}
#content {margin:100px auto;}

Actualización 21:25:
Timshel me lo acaba de pasar, parece que el truco es de hace mucho tiempo, la cuestion esta en meter <!-- <body> --> entre <head> y <body>

La primera forma que comenta manu solo ocultaba el banner sin quitarlo. El segundo engaña a blogger para que incluya el código del banner dentro de un comentario, por lo que si hace que no se cargue el banner.

MacOS X en tu PC

(1 comentario)

Logo de PearPC
PearPC es un emulador bajo licencia GPL independiente de la arquitectura de la plataforma PowerPC capaz de correr la mayoria de los sistemas operativos de PowerPC.

The following operating systems were tested and run (to some extend) under PearPC:

  • Mandrake Linux 9.1 for PPC: Runs very well
  • Darwin for PPC: Runs well
  • Mac OS X 10.3: Runs well with some caveats
  • OpenBSD for PPC: Crashes while booting (accesses PCI in an unsupported way)
  • NetBSD for PPC: Crashes while booting

El programa se encuentra en las primeras etapas de su desarrollo (versión 0.1) por lo que tiene bastantes errores.

Página 277 de 281« Primero...275276277278279...Último »