Что эквивалентно foldr, foldl в Emacs Lisp? - PullRequest
22 голосов
/ 22 ноября 2010

Что эквивалентно foldr, foldl в Emacs Lisp?

Ответы [ 3 ]

26 голосов
/ 22 ноября 2010

Если вы

(require 'cl)

, тогда вы можете использовать функцию Common Lisp reduce.Передайте аргумент ключевого слова :from-end t для foldr.

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)))
18 голосов
/ 10 ноября 2013

Начиная с Emacs-24.3, мы рекомендуем использовать cl-lib сверх cl (который планируется удалить в некотором отдаленном будущем), поэтому это будет:

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

и начиная с Emacs-25, вы также можете использовать пакет seq для этого:

(require 'seq)
(seq-reduce #'+ '(1 2 3 4) 0)
6 голосов
/ 03 августа 2014

Библиотека Common Lisp предоставляет множество функций последовательности , таких как отображение, фильтрация, свертывание, поиск и даже сортировка.Библиотека CL поставляется с Emacs по умолчанию, поэтому вам следует придерживаться ее.Однако мне действительно нравится библиотека dash.el, потому что она предоставляет огромное количество функций для манипулирования списком и деревом.Он также поддерживает анафорические макросы и поощряет функциональное программирование, которое делает код лаконичным и элегантным.

Сгибы Хаскелла соответствуют dash.el сгибам:

Сумма диапазона от 1 до 10 с использованием складок может выглядеть следующим образом в Haskell и dash.el:

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

Вы, наверное, знаете, что сгибы являются очень общими, и можно реализовать карты и фильтры с помощью сгибов.Например, чтобы увеличить каждый элемент на 2, карри и разделы на Haskell позволили бы получить краткий код, но в Elisp вы обычно пишете подробные одноразовые лямбды:

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

Угадайте, что в этом нет необходимостив dash.el с анафорическими макросами, которые допускают специальный синтаксис, выставляя переменные лямбды в виде ярлыков, таких как it и acc в сгибах.Анафорические функции начинаются с 2 тире вместо 1:

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

В dash.el:

: 1056 * имеется множество фолдоподобных функций
...