2010-11-22 4 views

Répondre

25

Si vous

(require 'cl) 

vous pouvez utiliser la fonction Common Lisp reduce. Passez l'argument mot-clé :from-end t pour 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

Depuis Emacs 24.3 nous recommandons l'utilisation de cl-lib sur cl (qui est prévu pour le retrait dans un avenir lointain), il serait:

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

et depuis Emacs-25, vous peut également utiliser le package seq pour que:

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

Cela devrait mieux être un commentaire à la réponse de Gareth Rees qu'une réponse distincte dans sa propre droit. – Thomas

+0

@Thomas Il n'est pas possible d'écrire des commentaires multilignes avec des exemples sur SO. – ceving

5

Common Lisp library fournit beaucoup de sequence functions comme la cartographie, fil ter, pliage, recherche et même tri. La bibliothèque CL est livrée avec Emacs par défaut, vous devez donc vous y tenir. Cependant j'aime beaucoup la bibliothèque dash.el, car elle fournit d'énormes quantités de fonctions pour les manipulations de liste et d'arbre. Il prend également en charge anaphoric macros et encourage la programmation fonctionnelle, ce qui rend le code concis et élégant.

plis Haskell correspondent à dash.el plis:

Somme d'une plage de 1 à 10 à l'aide de plis pourraient ressembler à ceci dans Haskell et dash.el:

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

Vous savez probablement que les plis sont très généraux, et il est possible de mettre en œuvre des cartes et des filtres via des plis . Par exemple, pour incrémenter chaque élément par 2, le corroyage et les articles de Haskell permettraient un code laconique, mais Elisp vous le feriez habituellement écrire lambdas bavard jetables comme ça:

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

Devinez quoi, il ne faut pas en dash.el avec des macros anaphoriques, qui permettent une syntaxe spéciale en exposant les variables d'un lambda en tant que raccourcis, comme it et acc en plis. fonctions anaphorique commencent par 2 tirets au lieu de 1:

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

Il y a beaucoup fonctions dépliable comme dans 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) 
Questions connexes