Untuk apa "itu"?

11

Misalnya dalam definisi yang -firstkita miliki:

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

Secara alami arti "itu" sangat sulit untuk dicari di google atau manual.

Alejandro Pedraza
sumber
4
Justru pertanyaan yang harus diajukan, dan kritik umum yang masuk akal tentang anaforis ini-itu-itu. Dalam Emacs , setidaknya (ini adalah "editor yang mendokumentasikan diri sendiri"), setiap string dokumen dari benda anaforis harus dengan jelas menyebutkannya, bahkan jika itu tampak jelas bagi beberapa orang yang akrab dengannya (sic), dan bahkan jika itu didokumentasikan dengan baik dalam manual. (Hanya satu pendapat.)
Drew

Jawaban:

10

Sebenarnya itu ada di sana dalam manual: https://github.com/magnars/dash.el#anaphoric-functions .

Pembaruan: memeriksa dan meratakan makro

Jika Anda menggunakan lispy , mulai dengan:

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

dan poin sebelumnya (--map, Anda dapat menekan xfuntuk menelepon lispy-flattendan mendapatkan:

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

Ini sedikit lebih rumit dengan kode ini, karena tanda hubung terlalu bersemangat untuk didelegasikan dan ditunda:

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

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

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

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

Cukuplah untuk mengatakan, itu itadalah var iterable implisit dan accadalah akumulator var.

Pada satu titik, saya mencoba menambahkan tambalan lambda pendek ke Emacs yang akan memungkinkan notasi ini, yang menurut saya lebih sederhana daripada makro anaforis:

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

Namun, itu tidak berhasil.

abo-abo
sumber
2
Bagi mereka yang tidak lispy, pp-macroexpand-last-sexp juga harus melakukan trik.
Malabarba
Bagus, saya tidak tahu tentang fungsi itu. Ini menggunakan pendekatan berbeda untuk multilining dari saya.
abo-abo