Для чого це "це"?


11

Наприклад, у визначенні -firstми маємо:

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

Природно, сенс "це" дуже важко переглядати або шукати в посібнику.


4
Саме питання, яке слід задати, і розумна загальна критика анафоричного цього і того. У Emacs , принаймні (це «самодокументірующійся редактор»), кожен документ рядок з анафорического штучка повинна чітко вказувати назву, навіть якщо це здається багатослівним деякими , хто знайомий з ним (так в оригіналі), і навіть якщо він добре задокументовано в посібнику. (Лише одна думка.)
Дрю

Відповіді:


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

Це трохи складніше з цим кодом, оскільки тире надто прагне делегувати та відкладати:

(--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
Для тих, хто не має ліпі, pp-macroexpand-last-sexp також повинен зробити свою справу.
Малабарба

Приємно, я не знав про цю функцію. Він використовує інший підхід до багатоосвітлення, ніж я.
або-або
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.