2010-11-22 16 views

cevap

25

Eğer

(require 'cl) 

sonra Common Lisp fonksiyonu reduce kullanabilirsiniz. foldr için :from-end t anahtar kelimesi argümanını iletin.

ELISP> (reduce #'list '(1 2 3 4)) 
(((1 2) 3) 4) 

ELISP> (reduce #'list '(1 2 3 4) :from-end t) 
(1 (2 (3 4))) 
12

Emacs 24.3 biz olurdu böylece, (bazı uzak bir gelecekte kaldırılması için planlanan) cl üzerinde cl-lib kullanımını tavsiye beri:

(require 'cl-lib) 
(cl-reduce #'list '(1 2 3 4)) 

ve Emacs-25 yılından beri, sen Ayrıca bunun için seq paketini kullanabilirsiniz:

(require 'seq) 
(seq-reduce #'list '(1 2 3 4)) 
+3

Bu daha iyi ayrı bir cevap daha Gareth Rees'lerin cevaba Yorum olmalı onun kendi hakkı. – Thomas

+0

@Thomas SO üzerine örneklerle çok satırlı yorum yazmak mümkün değildir. – ceving

5

Common Lisp library haritalama gibi sequence functions bol sağlar, fil Terleme, katlama, arama ve hatta sıralama. CL kütüphanesi varsayılan olarak Emacs ile gönderilir, bu yüzden ona bağlı kalmalısınız. Ancak liste ve ağaç manipülasyonları için muazzam miktarda fonksiyon sağladığı için, dash.el kütüphanesini gerçekten seviyorum. Aynı zamanda anaphoric macros'u destekler ve kodlamayı kısa ve zarif hale getiren fonksiyonel programlamayı teşvik eder.

Haskell'ın kıvrımlar dash.el kat tekabül:

ile -reduce
  • foldr1 ile
  • foldl1-reduce-r-from ile birlikte 0

    1 ila 10 kullanılarak kıvrımları Haskell bu gibi görünebilir bir dizi toplamı ve dash.el:

    foldl (+) 0 [1..10] -- Haskell 
    (-reduce-from '+ 0 (number-sequence 1 10)) ; Elisp 
    

    Muhtemelen kıvrımlar çok genel olduğunu, biliyorum, ve kıvrımlar aracılığıyla haritalar ve filtreler uygulamak mümkündür . Örneğin, 2 oranında her eleman artırmak için, Haskell'ın tımar ve bölümler veciz kodu sağlayacak, ancak elisp içinde genellikle böyle ayrıntılı ıskarta lambdas yazardı:

    foldr ((:) . (+2)) [] [1..10] -- Haskell 
    (-reduce-r-from (lambda (x acc) (cons (+ x 2) acc)) '() (number-sequence 1 10)) ; Elisp 
    

    o dash.el gerekli değildir Tahmin etmek ne, bir lambda değişkenini, it ve acc gibi kıvrımlarda açığa çıkararak özel sözdizimine izin veren anaporik makrolarla. dash.el yılında

    (--reduce-r-from (cons (+ it 2) acc) '() (number-sequence 1 10)) 
    

    vardır bol kat benzeri fonksiyonlar: Gönderimsel fonksiyonlar 2 tire yerine 1 ile başlar

    ;; Count elements matching a predicate 
    (-count 'evenp '(1 2 3 4 5)) ; 2 
    ;; Add/multiply elements of a list together 
    (-sum '(1 2 3 4 5)) ; 15 
    (-product '(1 2 3 4 5)) ; 120 
    ;; Find the smallest and largest element 
    (-min '(3 1 -1 2 4)) ; -1 
    (-max '(-10 0 10 5)) ; 10 
    ;; Find smallest/largest with a custom rule (anaphoric versions) 
    (--min-by (> (length it) (length other)) '((1 2 3) (4 5) (6))) ; (6) 
    (--max-by (> (length it) (length other)) '((1 2 3) (4 5) (6))) ; (1 2 3) 
    
  • İlgili konular