Po co „to”?

11

Na przykład w definicji -firstmamy:

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

Oczywiście znaczenie „to” jest bardzo trudne do przeszukania w Google lub wyszukiwania w instrukcji.

Alejandro Pedraza
źródło
4
Dokładnie pytanie, które należy zadać, oraz rozsądną ogólną krytykę anaforycznej „tego i tamtego”. W Emacsie , przynajmniej (jest to „edytor samokontrujący”), każdy ciąg dokumentów anaforycznej rzeczy powinien wyraźnie go wywoływać, nawet jeśli wydaje się to zbyt szczegółowe dla niektórych, którzy go znają (sic), a nawet jeśli to jest dobrze udokumentowane w instrukcji. (Tylko jedna opinia.)
Drew

Odpowiedzi:

10

Właściwie to jest tam w instrukcji: https://github.com/magnars/dash.el#anaphoric-functions .

Aktualizacja: sprawdzanie i spłaszczanie makr

Jeśli używasz lispy , zaczynając od:

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

i poprzedni punkt (--map, możesz nacisnąć, xfaby zadzwonić lispy-flatteni uzyskać:

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

Jest to nieco bardziej skomplikowane z tym kodem, ponieważ dash jest zbyt chętny do delegowania i odroczenia:

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

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

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

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

Wystarczy powiedzieć, że itjest to domniemana iterowalna zmienna var i accniejawna zmienna akumulatorowa var.

W pewnym momencie próbowałem dodać krótką łatkę lambda do Emacsa, która umożliwiłaby tę notację, która moim zdaniem jest prostsza niż makra anaforyczne:

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

Jednak nigdzie nie poszło.

abo-abo
źródło
2
Dla osób bez lispy, pp-macroexpand-last-sexp powinien również załatwić sprawę.
Malabarba
Fajnie, nie wiedziałem o tej funkcji. Używa innego podejścia do multiliningu niż ja.
abo-abo