¿Para qué sirve?

11

Por ejemplo en la definición de -firsttenemos:

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

Naturalmente, el significado de "it" es muy difícil de googlear o buscar en el manual.

Alejandro Pedraza
fuente
44
Precisamente la pregunta que uno debe hacer, y una crítica general razonable de anafórico esto y aquello. En Emacs , al menos (es "el editor autodocumentado"), cada cadena de documentos de una cosa anafórica debería indicarlo claramente, incluso si eso parece detallado para algunos que están familiarizados con él (sic), e incluso si está bien documentado en un manual. (Solo una opinión.)
Drew

Respuestas:

10

En realidad está justo ahí en el manual: https://github.com/magnars/dash.el#anaphoric-functions .

Actualización: inspección y aplanamiento de macros

Si usa lispy , comience con:

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

y el punto anterior (--map, puede presionar xfpara llamar lispy-flatteny obtener:

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

Es un poco más complejo con este código, ya que dash está demasiado ansioso por delegar y posponer:

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

Después 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))))

Después 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))))

Después 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))))

Basta decir que esa ites la var implícita iterable y acces el acumulador implícito var.

En un momento, intenté agregar un parche lambda corto a Emacs que habilitaría esta notación, que creo que es más simple que las macros anafóricas:

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

Sin embargo, no fue a ninguna parte.

abo-abo
fuente
2
Para aquellos sin lispy, pp-macroexpand-last-sexp también debería ser el truco.
Malabarba
Bien, no sabía sobre esa función. Está utilizando un enfoque diferente para multilínea que yo.
abo-abo