2010-10-08 37 views
9

Tôi tự hỏi nếu có một bộ mã Emacs Lisp thực hiện một số chức năng của Clojure. Ví dụ, -> và - >> và comp và một phần, và những thứ khác?Chức năng Clojure cho Emacs?

Cảm ơn bạn.

Trả lời

12

Tôi đã chuyển các macro ->->> tới Emacs Lisp một thời gian trước đây. Tôi thỉnh thoảng sử dụng chúng trong mã cấu hình của mình và chúng dường như hoạt động tốt.

(defmacro -> (e &rest es) 
    (if (and (consp es) (not (consp (cdr es)))) 
     (if (consp (car es)) 
      `(,(caar es) ,e ,@(cdar es)) 
     `(,(car es) ,e)) 
    (if (consp es) 
     `(-> (-> ,e ,(car es)) ,@(cdr es)) 
     e))) 

(defmacro ->> (e &rest es) 
    (if (and (consp es) (not (consp (cdr es)))) 
     (if (consp (car es)) 
      `(,@(car es) ,e) 
     `(,(car es) ,e)) 
    (if (consp es) 
     `(->> (->> ,e ,(car es)) ,@(cdr es)) 
     e))) 
2

Không chắc chắn về những người khác, nhưng một phần được triển khai trong nhánh lexbind của Emacs là "cà ri".

0

Gần đây tôi đã viết các macro này. Chúng không đệ quy và ít chi tiết hơn. Nhưng tôi chưa thử nghiệm chúng rộng rãi.

(defmacro ->> (x &rest forms) 
    (while forms 
     (setq x (append (pop forms) (list x)))) 
    x) 

(defmacro -> (x &rest forms) 
    (while forms 
    (let ((form (pop forms))) 
     (push x (cdr form)) 
     (setq x form))) 
    x) 
4

Bạn chắc chắn nên xem dash.el. Nó cung cấp rất nhiều chức năng Clojure lấy cảm hứng từ như:

  • -map (fn list)
  • -Giảm-từ (fn initial-value list)
  • -Giảm-r-từ (fn initial-value list)
  • -Giảm (fn list)
  • -reduce- r (fn list)
  • -filter (pred list)
  • -remove (pred list)
  • -keep (fn list)
  • -map-khi (pred rep list)
  • -map lập chỉ mục (fn list)
  • -flatten (l)
  • -concat (&rest lists)
  • -mapcat (fn list)
  • -cons * (&rest args)
  • -count (pred list)
  • -any? (pred list)
  • -all? (pred list)
  • -Không? (pred list)
  • - chỉ một số?(pred list)
  • -mỗi (list fn)
  • -mỗi-while (list pred fn)
  • -dotimes (num fn)
  • -repeat (n x)
  • -slice (list from &optional to)
  • -Tham (n list)
  • -drop (n list)
  • -Tham trong khi (pred list)
  • -drop-while (pred list)
  • -split-at (n list)
  • -insert-at (n x list)
  • -split-với (pred list)
  • -separate (pred list)
  • -partition (n list)
  • -partition- tất cả-trong-bước (n step list)
  • -partition-in-steps (n step list)
  • -partition-tất cả (n list)
  • -partition-by (fn list)
  • -partition-by-header (fn list)
  • -group-by (fn list)
  • -interpose (sep list)
  • -interleave (&rest lists)
  • - zip-with (fn list1 list2)
  • -zip (list1 list2)
  • -đầu tiên (pred list)
  • -last (pred list)
  • -union (list list2)
  • -difference (list list2)
  • -intersection (list list2)
  • -distinct (list)
  • -contains?(list element)
  • -Phân loại file (predicate list)
  • -partial (fn &rest args)
  • -rpartial (fn &rest args)
  • -applify (fn)
  • ->(x &optional form &rest more)
  • - >>(x form &rest more)
  • ->(x form &rest more)
  • -khi -let (var-val &rest body)
  • -khi-let * (vars-vals &rest body)
  • -Nếu-hãy (var-val then &optional else)
  • -Nếu-let * (vars-vals then &optional else)
  • ! Nhược điểm (car cdr)
  • ! Cdr (list)

Tôi tìm thấy thư viện này cực kỳ hữu ích .

Các vấn đề liên quan