Cái này để làm gì?


11

Ví dụ trong định nghĩa của -firstchúng tôi có:

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

Đương nhiên, ý nghĩa của "nó" là rất khó để google hoặc tìm kiếm trong hướng dẫn.


4
Chính xác là câu hỏi người ta nên hỏi, và một lời chỉ trích chung hợp lý về ẩn dụ này-và-kia. Trong Emacs , ít nhất (đó là "trình soạn thảo tự viết tài liệu"), mỗi chuỗi doc của một điều anaphoric nên gọi nó rõ ràng, ngay cả khi điều đó có vẻ dài dòng đối với một số người quen thuộc với nó (sic) và ngay cả khi nó là tài liệu tốt trong một hướng dẫn. (Chỉ một ý kiến.)
vẽ ngày

Câu trả lời:


10

Trên thực tế, nó có ngay trong hướng dẫn: https://github.com/magnars/dash.el#anaphoric-fifts .

Cập nhật: kiểm tra và làm phẳng các macro

Nếu bạn đang sử dụng lispy , hãy bắt đầu bằng:

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

và điểm trước (--map, bạn có thể nhấn xfđể gọi lispy-flattenvà lấy:

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

Mã này phức tạp hơn một chút, vì dấu gạch ngang quá háo hức để ủy thác và hoãn lại:

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

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

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

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

Đủ để nói, đó itlà var lặp ngầm định và acclà var tích lũy ngầm.

Tại một thời điểm, tôi đã cố gắng thêm một bản vá lambda ngắn vào Emacs để kích hoạt ký hiệu này, điều mà tôi nghĩ là đơn giản hơn các macro anaphoric:

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

Tuy nhiên, nó đã đi đến đâu.


2
Đối với những người không có lispy, pp-macroExand-last-sexp cũng nên thực hiện thủ thuật này.
Malabarba 3/03/2015

Thật tuyệt, tôi không biết về chức năng đó. Đó là sử dụng một cách tiếp cận khác nhau cho đa cấp hơn tôi.
abo-abo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.