Есть ли сжатый emacs lisp эквивалент Python [n: m] фрагментов списка? - программирование

Есть ли сжатый emacs lisp эквивалент Python [n: m] фрагментов списка?

Одна вещь, которую я считаю отсутствующей в emacs lisp, на удивление, представляет собой конкретный бит манипуляции списком. Я скучаю по сокращению списка Python.

>>> mylist = ["foo", "bar", "baz", "qux", "frobnitz"]
>>> mylist[1:4]
['bar', 'baz', 'qux']

Я вижу функции butlast и nthcdr в документации emacs, которая даст те же результаты из кода:

(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(butlast (nthcdr 1 mylist) 1)
;; ("bar" "baz" "qux")

Есть ли более сжатый способ получения списка, чем объединение butlast и nthcdr?

4b9b3361

Ответ 1

Конечно, есть:

(require 'cl)
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(subseq mylist 1 4)
;; ("bar" "baz" "qux")

Ответ 2

Общая библиотека Lisp отлично, но если ваша кодовая база становится большой и вы хотите писать сжатый код в функциональном стиле, я подтверждаю dash.el, которая предоставляет огромное количество функций для манипулирования списком и деревом. Существует функция -slice, которая ведет себя так же, как нарезка Python:

(-slice (number-sequence 1 10) 1 7 2) ; (2 4 6)

Аргументы в порядке: список, старт, (необязательный) стоп, (необязательный) шаг.