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
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
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.
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
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
Benvenuti nel buio. – huaiyuan