2009-10-26 8 views
9

Ho appreso un bel po 'di schemi da SICP, ma ora sono più interessato alla chiarezza comune. So che lisp's common lisp's fold è reduce, con argomenti speciali per la piegatura sinistra o destra, ma qual è l'equivalente di unfold? Googling non ha aiutato molto. In effetti ho l'impressione che non si spieghi ???"unfold" per comune lisp?

risposta

13

Comune Lisp dispone di (loop ... collect ...). Confronta

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

con la sua equivalenza con unfold:

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

In generale, è fondamentalmente (unfold p f g seed)

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

Edit: fissare errore di battitura

+2

Hmm è interessante. Ho giocato con il loop dell'ultima ora: P è fantastico! Adoro quando i linguaggi di programmazione hanno questi piccoli sottoprogrammi incorporati che hanno la loro sintassi e un insieme di regole da comprendere, come le stringhe di formato. Il ciclo è roba potente! – nullpointer

+2

Benvenuti nel buio. – huaiyuan

3

L'iperspec lisp comune non definisce una funzione unfold, ma è sicuramente possibile scriverne una propria. La sua definizione di schema si traduce quasi in simbolo per simbolo.

+3

Grazie. È sfortunato, ma suppongo che scriverò da solo. Mi piace molto lo schema per essere così puro e con una così bella bontà funzionale, ma mi sono rassegnato a imparare l'intricata, ma espressiva lisp comune. È come imparare l'inglese piuttosto che l'esperanto, sai? – nullpointer