Ответ 1
Конечно, есть:
(require 'cl)
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(subseq mylist 1 4)
;; ("bar" "baz" "qux")
Одна вещь, которую я считаю отсутствующей в 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
?
Конечно, есть:
(require 'cl)
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(subseq mylist 1 4)
;; ("bar" "baz" "qux")
Общая библиотека Lisp отлично, но если ваша кодовая база становится большой и вы хотите писать сжатый код в функциональном стиле, я подтверждаю dash.el
, которая предоставляет огромное количество функций для манипулирования списком и деревом. Существует функция -slice
, которая ведет себя так же, как нарезка Python:
(-slice (number-sequence 1 10) 1 7 2) ; (2 4 6)
Аргументы в порядке: список, старт, (необязательный) стоп, (необязательный) шаг.