2010-11-22 16 views

Respuesta

25

Si

(require 'cl) 

a continuación, puede utilizar la función de Common Lisp reduce. Pase el argumento de palabra clave :from-end t por 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

Desde Emacs-24.3 que recomiendan el uso de cl-lib sobre cl (que está previsto para el retiro en un futuro lejano), por lo que sería:

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

y desde Emacs-25, se también puede utilizar el paquete para que seq:

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

Esto debería mejor que sea un comentario a la respuesta Gareth Rees que una respuesta por separado en su derecho propio. – Thomas

+0

@Thomas No es posible escribir comentarios de varias líneas con ejemplos en SO. – ceving

5

Common Lisp library proporciona un montón de sequence functions como la cartografía, fil tering, plegado, búsqueda e incluso clasificación. La biblioteca CL se envía con Emacs de forma predeterminada, por lo que debe atenerse a ella. Sin embargo, me gusta mucho la biblioteca dash.el, porque proporciona enormes cantidades de funciones para manipulaciones de listas y árboles. También es compatible con anaphoric macros y fomenta la programación funcional, lo que hace que el código sea conciso y elegante.

pliegues de Haskell corresponden con dash.el pliegues:

Suma de un rango de 1 a 10 utilizando pliegues podría ser similar en esto en Haskell y dash.el:

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

Usted probablemente sabe, que los pliegues son muy generales, y es posible implementar mapas y filtros a través de los pliegues . Por ejemplo, para incrementar cada elemento por 2, currificación y secciones de Haskell permitirían código conciso, pero en Elisp que normalmente escribir lambdas detallado de usar y tirar por el estilo:

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

Adivina qué, no es necesario en dash.el con macros anafóricas, que permiten una sintaxis especial al exponer las variables de un lambda como accesos directos, como it y acc en pliegues. funciones anafóricos comienzan con 2 guiones en vez de 1:

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

hay funciones montón plegable como en 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) 
Cuestiones relacionadas