Troviamo questo generatore di funzioni per realizzare la composizione in "ANSI Common Lisp" di P.Graham (pagina 110). Gli argomenti sono n> 0 nomi di funzioni quotate. Non capisco completamente, quindi mi cito il codice qui e specificare le mie domande sotto di esso:(comporre) in Common Lisp
(defun compose (&rest fns)
(destructuring-bind (fn1 . rest) (reverse fns)
#'(lambda (&rest args)
(reduce #'(lambda (v f) (funcall f v))
rest
:initial-value (apply fn1 args)))))
La lista degli argomenti di comporre si inverte e scompattato, la sua (ora primo) elemento legato a 'fn1 'e il resto a' riposo '. Il corpo del lambda più esterno è un riduttore: (funcall fi (funcall fi-1 ...)), con gli operandi in ordine invertito per ripristinare quello iniziale.
1) Qual è il ruolo dell'espressione lambda più esterna? Vale a dire, da dove vengono le sue "args"? La struttura dei dati è specificata come il primo argomento di destructuring-bind? 2) Da dove viene il primo lambda a prendere i suoi due argomenti?
Voglio dire che posso apprezzare ciò che fa il codice, ma ancora lo scope lessicale è un po 'un mistero per me. In attesa di tutti i commenti! // in anticipo // Marco
Perché tutte le staffe pensili? – Marcin
Le mie scuse, non ho visto la discussione al riguardo su http://stackoverflow.com/questions/5928106/compose-example-in-paul-grahams-ansi-common-lisp – ocramz
@Marcin, per guidare l'occhio;) è una cattiva pratica? Sono ancora un noob – ocramz