2010-11-22 14 views

risposta

25

Se

(require 'cl) 

quindi è possibile utilizzare la funzione Common Lisp reduce. Passa l'argomento della parola chiave :from-end t per foldr.

ELISP> (reduce #'list '(1 2 3 4)) 
(((1 2) 3) 4) 

ELISP> (reduce #'list '(1 2 3 4) :from-end t) 
(1 (2 (3 4))) 
12

Dal Emacs-24.3 si consiglia l'uso di cl-lib sopra cl (che è prevista per la rimozione in un lontano futuro), quindi sarebbe:

(require 'cl-lib) 
(cl-reduce #'list '(1 2 3 4)) 

e poiché Emacs-25, si può anche utilizzare il pacchetto seq per questo:

(require 'seq) 
(seq-reduce #'list '(1 2 3 4)) 
+3

Questo dovrebbe meglio essere un commento alla risposta Gareth Rees' di una risposta separata nel suo propria ragione. – Thomas

+0

@Thomas Non è possibile scrivere commenti multi linea con esempi su SO. – ceving

5

Common Lisp library fornisce un sacco di sequence functions come la mappatura, fil tering, pieghevole, ricerca e persino ordinamento. La libreria CL viene fornita con Emacs per impostazione predefinita, quindi è necessario attenersi ad essa. Mi piace molto la libreria dash.el, perché fornisce enormi quantità di funzioni per la manipolazione di elenchi e alberi. Supporta anche anaphoric macros e incoraggia la programmazione funzionale, che rende il codice conciso ed elegante.

pieghe Haskell corrispondono dash.el pieghe:

Somma di una gamma da 1 a 10 che utilizzano pieghe potrebbe essere simile a questo in Haskell e dash.el:

foldl (+) 0 [1..10] -- Haskell 
(-reduce-from '+ 0 (number-sequence 1 10)) ; Elisp 

Probabilmente sapete, che pieghe sono molto generali, ed è possibile realizzare mappe e filtri via pieghe . Ad esempio, per incrementare ogni elemento da 2, accattivarsi e le sezioni di Haskell permetterebbero il codice stringato, ma in Elisp che di solito scrivere lambda verbose usa e getta così:

foldr ((:) . (+2)) [] [1..10] -- Haskell 
(-reduce-r-from (lambda (x acc) (cons (+ x 2) acc)) '() (number-sequence 1 10)) ; Elisp 

Indovinate un po ', non è necessario in dash.el con macro anaforiche, che consentono una sintassi speciale esponendo le variabili di una lambda come scorciatoie, come it e acc in piega. funzioni anaforica iniziano con 2 trattini invece di 1:

(--reduce-r-from (cons (+ it 2) acc) '() (number-sequence 1 10)) 

ci sono funzioni molta fold-come in dash.el:

;; Count elements matching a predicate 
(-count 'evenp '(1 2 3 4 5)) ; 2 
;; Add/multiply elements of a list together 
(-sum '(1 2 3 4 5)) ; 15 
(-product '(1 2 3 4 5)) ; 120 
;; Find the smallest and largest element 
(-min '(3 1 -1 2 4)) ; -1 
(-max '(-10 0 10 5)) ; 10 
;; Find smallest/largest with a custom rule (anaphoric versions) 
(--min-by (> (length it) (length other)) '((1 2 3) (4 5) (6))) ; (6) 
(--max-by (> (length it) (length other)) '((1 2 3) (4 5) (6))) ; (1 2 3)