C'est pour quoi?

11

Par exemple dans la définition de -firstnous avons:

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

Naturellement, la signification de "it" est très difficile à rechercher ou à rechercher dans le manuel.

Alejandro Pedraza
la source
4
C'est précisément la question qu'il faut se poser, et une critique générale raisonnable de ceci et cela anaphorique. Dans Emacs , au moins (c'est "l'éditeur auto-documenté"), chaque chaîne de doc d'un truc anaphorique devrait clairement l'appeler, même si cela semble verbeux pour certains qui le connaissent (sic), et même s'il est bien documenté dans un manuel. (Juste une opinion.)
Drew

Réponses:

10

En fait, c'est juste là dans le manuel: https://github.com/magnars/dash.el#anaphoric-functions .

Mise à jour: inspection et aplatissement des macros

Si vous utilisez Lispy , commencez par:

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

et le point précédent (--map, vous pouvez appuyer sur xfpour appeler lispy-flattenet obtenir:

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

C'est un peu plus complexe avec ce code, car dash est trop désireux de déléguer et de reporter:

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

Aprè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))))

Aprè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))))

Aprè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))))

Il suffit de dire que itc'est la var itérable implicite et accla var accumulatrice implicite.

À un moment donné, j'ai essayé d'ajouter un court patch lambda à Emacs qui permettrait cette notation, qui je pense est plus simple que les macros anaphoriques:

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

Cependant, cela n'est en quelque sorte allé nulle part.

abo-abo
la source
2
Pour ceux sans lispy, pp-macroexpand-last-sexp devrait également faire l'affaire.
Malabarba
Bien, je ne connaissais pas cette fonction. Il utilise une approche de multilining différente de moi.
abo-abo