2010-11-22 5 views

답변

25

당신이

(require 'cl) 

다음은 CL의 기능 reduce을 사용 할 수 있습니다. foldr에 키워드 인수 :from-end t을 전달하십시오.

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

이맥스 - 24.3은 우리가 될 수 있도록, (먼 미래에 제거 될 예정입니다) cl 이상 cl-lib의 사용을 권장합니다 이후 :

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

와 이맥스 25 이후를, 당신 또한의 seq 패키지를 사용할 수 있습니다

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

이 더 나은에서 별도의 대답보다는 가레스리스 '대답에 설명해야 그 자신의 권리. – Thomas

+0

@ 토마스 SO에 예제와 함께 여러 행 주석을 쓸 수 없습니다. – ceving

5

Common Lisp library 매핑 같은 sequence functions을 많이 제공하고, FIL 조롱, 접기, 검색, 심지어 정렬. CL 라이브러리는 기본적으로 이맥스와 함께 제공되기 때문에이를 고수해야한다. 그러나 목록과 트리 조작을위한 엄청난 양의 함수를 제공하기 때문에 실제로는 dash.el 라이브러리를 좋아합니다. 또한 anaphoric macros을 지원하며 코드 작성을 간결하고 우아하게 만드는 기능 프로그래밍을 권장합니다.

하스켈의 주름은 dash.el 주름 해당합니다

-reduce
  • foldr1
  • foldl1-reduce-r-from와 함께 0

    1 ~ 10 사용하여 주름이 하스켈이에 같이 수있는 범위의 합계와 dash.el :

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

    당신은 아마 주름은 매우 일반적인 것을 알고, 주름을 통해지도와 필터를 구현할 수 . 예를 들어, 2에 의해 모든 요소를 ​​증가, 하스켈의 태닝 및 섹션은 간결한 코드를 허용,하지만 Elisp에서 보통 같은 자세한 버리는 람다를 작성합니다

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

    dash.el에 필요하지 않습니다 무엇을 추측 애매한 매크로를 사용하여 람다의 변수를 itacc과 같은 단축키로 표시함으로써 특수 구문을 허용합니다. dash.el

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

    이 있습니다 많은 배와 같은 기능 : Anaphoric 기능이 대시 대신 1로 시작

    ;; 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) 
    
  • 관련 문제