Qual è l'equivalente di foldr, foldl in Emacs Lisp?Qual è l'equivalente di foldr, foldl in Emacs Lisp?
risposta
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)))
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))
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:
foldl
con-reduce-from
foldr
con-reduce-r-from
foldl1
con-reduce
foldr1
con-reduce-r
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)
- 1. foldr e foldl ulteriori spiegazioni ed esempi
- 2. Funzioni specifiche di ordine superiore con foldr e foldl
- 3. PPRINT in Emacs Lisp?
- 4. In Lisp (Clojure, Emacs Lisp), qual è la differenza tra lista e preventivo?
- 5. Uso pratico di `foldl`
- 6. Accumulatore in foldr
- 7. Emacs senza Lisp
- 8. Evidenziazione sintassi Emacs Lisp
- 9. Sovrascrittura di una funzione in Emacs Lisp
- 10. La mia funzione di foldl riscritta è ottimizzata?
- 11. Schema dialetto di Lisp in Emacs
- 12. Word foldl 'non è ottimizzato così come Int foldl'
- 13. Differenza di struttura tra common lisp ed emacs lisp
- 14. In Emacs Lisp, come trovare dove è definito il simbolo
- 15. Debug Emacs Lisp modo maggiore
- 16. Date e orari in Emacs Lisp
- 17. Come aggiungo le date in Emacs usando Emacs Lisp?
- 18. quale shell-command in emacs lisp?
- 19. Emacs Lisp: valuta variabile in alist
- 20. Come copiare negli appunti in Emacs Lisp
- 21. avvolgere una funzione in emacs lisp
- 22. nesting backquote e `in emacs lisp
- 23. moltiplicazione della lista vuota in emacs lisp
- 24. Qual è la differenza tra Lisp-1 e Lisp-2?
- 25. Come implementare zip con foldl (in una lingua ansiosa)
- 26. Qual è l'equivalente R di progn in lisp?
- 27. Qual è l'applicazione Lisp più impressionante?
- 28. Differenza tra simbolo e nome della variabile in Emacs Lisp
- 29. foldl Attuazione con errori di runtime
- 30. estratto/slice/riordina gli elenchi in (emacs) lisp?
Questo dovrebbe meglio essere un commento alla risposta Gareth Rees' di una risposta separata nel suo propria ragione. – Thomas
@Thomas Non è possibile scrivere commenti multi linea con esempi su SO. – ceving