Para que serve isto?


11

Por exemplo, na definição de -first, temos:

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

Naturalmente, o significado de "it" é muito difícil de pesquisar ou pesquisar no manual.


4
Precisamente a pergunta que se deve fazer, e uma crítica geral razoável a isto e aquilo anafórico. No Emacs , pelo menos (é "o editor de auto-documentação"), cada sequência de documentos de uma coisa anafórica deve chamá-la claramente, mesmo que isso pareça detalhado para alguns que estão familiarizados com ela (sic), e mesmo que está bem documentado em um manual. (Apenas uma opinião).
Drew

Respostas:


10

Na verdade, está bem ali no manual: https://github.com/magnars/dash.el#anaphoric-functions .

Atualização: inspecionando e achatando macros

Se você estiver usando o lispy , comece com:

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

e o ponto anterior (--map, você pode pressionar xfpara ligar lispy-flattene obter:

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

É um pouco mais complexo com esse código, pois o dash está ansioso demais para delegar e adiar:

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

Depois 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))))

Depois 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))))

Depois 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 dizer que ité o var iterável implícito e accé o var acumulador implícito.

Em um ponto, tentei adicionar um pequeno patch lambda ao Emacs que habilitaria essa notação, que eu acho que é mais simples que as macros anafóricas:

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

No entanto, meio que não foi a lugar nenhum.


2
Para aqueles sem lispy, pp-macroexpand-last-sexp também deve fazer o truque.
Malabarba

Bom, eu não sabia sobre essa função. Está usando uma abordagem diferente para multilinhas do que eu.
abo-abo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.