Wofür ist das?


11

Zum Beispiel in der Definition von haben -firstwir:

(--first (funcall pred it) list))

Natürlich ist die Bedeutung von "es" sehr schwer zu googeln oder im Handbuch zu suchen.


4
Genau die Frage, die man stellen sollte, und eine vernünftige allgemeine Kritik an anaphorischem Dies und Das. Zumindest in Emacs (es ist "der selbstdokumentierende Editor") sollte jede Dokumentzeichenfolge eines anaphorischen Dings eindeutig darauf hinweisen, selbst wenn dies einigen, die damit vertraut sind, ausführlich erscheint (sic), und selbst wenn dies der Fall ist ist in einem Handbuch gut dokumentiert. (Nur eine Meinung.)
Drew

Antworten:


10

Eigentlich ist es genau dort im Handbuch: https://github.com/magnars/dash.el#anaphoric-functions .

Update: Überprüfen und Reduzieren von Makros

Wenn Sie lispy verwenden , beginnen Sie mit:

;; anaphoric version
(--map (* it it) '(1 2 3 4))

und den Punkt zuvor (--mapkönnen Sie drücken, xfum anzurufen lispy-flattenund zu erhalten:

;; anaphoric version
(mapcar (lambda (it) (* it it)) (quote (1 2 3 4)))

Mit diesem Code ist es etwas komplexer, da Dash zu eifrig ist, um zu delegieren und zu verschieben:

(--reduce (max it acc) '(1 2 3 4))

Nachher xfM:

(let ((list-value (quote (1 2 3 4))))
  (if list-value (--reduce-from (max it acc)
                                (car list-value)
                                (cdr list-value))
    (let (acc it)
      (max it acc))))

Nachher fjfxfM:

(let ((list-value (quote (1 2 3 4))))
  (if list-value (let ((acc (car list-value)))
                   (--each (cdr list-value)
                     (setq acc (max it acc)))
                   acc)
    (let (acc it)
      (max it acc))))

Nachher fjxfM:

(let ((list-value (quote (1 2 3 4))))
  (if list-value (let ((acc (car list-value)))
                   (let ((list (cdr list-value))
                         (it-index 0))
                     (while list (let ((it (car list)))
                                   (setq acc (max it acc)))
                            (setq it-index (1+ it-index))
                            (!cdr list)))
                   acc)
    (let (acc it)
      (max it acc))))

Es genügt zu sagen, dass dies itdie implizite iterierbare Variable und accdie implizite Akkumulator-Variable ist.

Irgendwann habe ich versucht, Emacs einen kurzen Lambda-Patch hinzuzufügen, der diese Notation ermöglicht, die meiner Meinung nach einfacher ist als anaphorische Makros:

(map #(* % %) '(1 2 3 4))
(cl-reduce #(max %1 %2) '(1 2 3 4))

Es ging jedoch irgendwie nirgendwo hin.


2
Für diejenigen ohne Lispy sollte pp-macroexpand-last-sexp ebenfalls den Trick machen.
Malabarba

Schön, ich wusste nichts über diese Funktion. Es verwendet einen anderen Ansatz für Multilining als ich.
Abo-Abo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.