Was ist äquivalent von foldr, foldl in Emacs Lisp?Was ist das Äquivalent von foldr, foldl in Emacs Lisp?
Antwort
Wenn Sie
(require 'cl)
dann können Sie die Common Lisp Funktion reduce
verwenden. Übergeben Sie das Schlüsselwortargument :from-end t
für 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)))
Da Emacs-24.3 wir die Verwendung von cl-lib
über cl
empfehlen (die für die Entfernung in ferner Zukunft geplant ist), so dass es sein würde:
(require 'cl-lib)
(cl-reduce #'list '(1 2 3 4))
und seit Emacs-25, Sie kann auch das seq
Paket für das verwenden:
(require 'seq)
(seq-reduce #'list '(1 2 3 4))
Common Lisp library viele sequence functions wie Mapping bietet, fil teren, falten, suchen und sogar sortieren. CL-Bibliothek wird standardmäßig mit Emacs ausgeliefert, also sollten Sie sich daran halten. Ich mag jedoch wirklich dash.el
Bibliothek, weil es enorme Mengen von Funktionen für Listen- und Baummanipulationen bietet. Es unterstützt auch anaphoric macros und ermutigt funktionale Programmierung, die Code prägnant und elegant macht.
Haskells Falten entsprechen dash.el
Faltungen:
foldl
mit-reduce-from
foldr
mit-reduce-r-from
foldl1
mit-reduce
foldr1
mit-reduce-r
Summe eines Bereichs von 1 bis 10 unter Verwendung von Falten in dieser wie in Haskell und dash.el
aussehen könnte:
foldl (+) 0 [1..10] -- Haskell
(-reduce-from '+ 0 (number-sequence 1 10)) ; Elisp
Sie wissen wahrscheinlich, dass Falten sehr allgemein gehalten sind, und es ist möglich, Karten und Filter über Falten zu implementieren . Zum Beispiel würde es ermöglichen, jedes Element von 2, Haskells currying und Abschnitte zu erhöhen für terse Code, aber in Elisp würden Sie in der Regel schreiben ausführliche Wegwerf-Lambda-Ausdrücke wie folgt aus:
foldr ((:) . (+2)) [] [1..10] -- Haskell
(-reduce-r-from (lambda (x acc) (cons (+ x 2) acc)) '() (number-sequence 1 10)) ; Elisp
Ratet mal, was es in dash.el
nicht notwendig ist, mit anaphorischen Makros, die eine spezielle Syntax ermöglichen, indem sie Variablen eines Lambda als Abkürzungen wie it
und acc
in Faltungen offenlegen. Anaphorische Funktionen beginnen mit zwei Strichen statt 1:
(--reduce-r-from (cons (+ it 2) acc) '() (number-sequence 1 10))
Es gibt viele faltenartige Funktionen 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. Haskell foldr und foldl
- 2. foldr und foldl in DrRacket
- 3. Funktionen definieren mit foldl foldr
- 4. Haskell foldl Implementierung mit foldr
- 5. foldr und foldl weitere Erläuterungen und Beispiele
- 6. Was bedeutet # [...] in emacs-lisp?
- 7. Was ist das Common Lisp-Äquivalent des Scheme-Standardobjekts?
- 8. Was ist dein empfohlener Emacs Lisp?
- 9. Was bedeutet^L in (Emacs Lisp) Quellcode?
- 10. Funktionsbeschreibung der höheren Ordnung mit foldr und foldl
- 11. Haskells foldr Äquivalent in Java 8
- 12. Was ist das Ruby-Äquivalent von preg_quote()?
- 13. Was ist das Servlet-Äquivalent von Server.MapPath?
- 14. Was ist das WinRT-Äquivalent von InputBindings?
- 15. Was ist das Xamarin.Forms-Äquivalent von layoutSubviews?
- 16. Was ist das Rust-Äquivalent von `size_t`?
- 17. Emacs Äquivalent von ct
- 18. Was ist das 3.16-Äquivalent von SPIN_LOCK_UNLOCKED?
- 19. Was ist das Cocoa-Äquivalent von UpdateSystemActivity?
- 20. Was ist das Flash-Äquivalent von FlexEvent.CREATION_COMPLETE
- 21. Was ist das WCF-Äquivalent von HttpContext.Current.Request.RawUrl?
- 22. Was ist das SQL-Äquivalent von COUNTIF?
- 23. Was ist das .NET-Äquivalent von JMX?
- 24. Was ist das Java-Äquivalent von Debugger.Launch()?
- 25. Was ist das Bluebird-Äquivalent von `Q.when`?
- 26. Was ist das Dask-Äquivalent von numpy.tile?
- 27. In Emacs kopieren Lisp
- 28. PPRINT in Emacs Lisp?
- 29. Was Emacs Lisp Funktion ist `` require` `` autoload` soll `` laden``
- 30. In Lisp (Clojure, Emacs Lisp), was ist der Unterschied zwischen Liste und Zitat?
Dieses sollte besser in als eine separate Antwort einen Kommentar zu Gareth Rees' Antwort sein, ihre eigenes Recht. – Thomas
@Thomas Es ist nicht möglich, mehrzeilige Kommentare mit Beispielen auf SO zu schreiben. – ceving