Для чего это?

11

Например, в определении -firstмы имеем:

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

Естественно, значение «это» очень трудно гуглить или искать в руководстве.

Алехандро Педраса
источник
4
Точно вопрос, который нужно задать, и разумная общая критика анафорического этого и того. По крайней мере, в Emacs (это «самодокументирующийся редактор») каждая строка документа анафорической штуковины должна явно вызывать это, даже если это кажется многословным для тех, кто знаком с ним (sic), и даже если оно хорошо задокументировано в руководстве. (Только одно мнение.)
Дрю

Ответы:

10

На самом деле это прямо в руководстве: https://github.com/magnars/dash.el#anaphoric-functions .

Обновление: проверка и выравнивание макросов

Если вы используете lispy , начните с:

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

и точку до (--map, вы можете нажать, xfчтобы позвонить lispy-flattenи получить:

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

С этим кодом все немного сложнее, поскольку dash слишком хочет делегировать и откладывать:

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

После 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))))

После 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))))

После 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))))

Достаточно сказать, что itэто неявный итеративный var и accнеявный аккумуляторный var.

В какой-то момент я попытался добавить короткий лямбда-патч в Emacs, который бы включил эту нотацию, что, я думаю, проще, чем анафорические макросы:

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

Тем не менее, это вроде как никуда не делось.

Або-або
источник
2
Для тех, у кого нет lispy, pp-macroexpand-last-sexp также должен помочь.
Малабарба
Хорошо, я не знал об этой функции. Он использует другой подход для мультилининга, чем я.
abo-abo