2009-10-26 13 views
9

Aprendí un poco de esquema de SICP pero ahora estoy más interesado en el ceceo común. Sé que el ceceo común fold es reduce, con argumentos especiales para plegado a la izquierda o derecha, pero ¿cuál es el equivalente a unfold? Google no ha ayudado mucho. De hecho, me da la impresión de que no se desarrolla?"desplegar" para el ceceo común?

Respuesta

13

Common Lisp tiene (loop ... collect ...). Comparar

 
(loop for x from 1 to 10 collect (* x x)) 

con su equivalencia utilizando unfold:

 
(unfold (lambda (x) (> x 10)) 
    (lambda (x) (* x x)) 
    (lambda (x) (+ x 1)) 
    1) 

En general, (unfold p f g seed) es básicamente

 
(loop for x = seed then (g x) until (p x) collect (f x)) 

Editar: fijar errata

+2

Hmm eso es interesante. He estado jugando con loop durante la última hora: ¡P es una gran cosa! Me encanta cuando los lenguajes de programación tienen este pequeño tipo de sublenguajes incrustados que tienen su propia sintaxis y un conjunto de reglas para comprender, como las cadenas de formato. ¡Loop es algo poderoso! – nullpointer

+2

Bienvenido al lado oscuro. – huaiyuan

3

El lisp hyperspec común no define una función unfold, pero ciertamente puede escribir la suya. Su definición de esquema traduce casi símbolo para símbolo.

+3

Gracias. Eso es desafortunado, pero supongo que sí, escribiré el mío. Me gusta mucho el esquema por ser tan puro y tener una bondad funcional tan hermosa, pero me he resignado a aprender el enigmático y enrevesado ceceo común. Es como aprender inglés en lugar de esperanto, ¿sabes? – nullpointer

Cuestiones relacionadas