2012-11-01 19 views
16

Jedną z rzeczy, których brakuje mi w emacs-seplenie, jest zaskakująco szczególna manipulacja listą. Tęsknię za streszczeniem listy Pythona.Czy istnieje zwięzły odpowiednik fragmentów list w języku Python [n: m] emacsa?

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

widzę funkcje butlast i nthcdr w dokumentacji emacs, które dają takie same wyniki z kodu tak:

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

Czy jest bardziej zwięzły sposób dotarcia kawałek listy niż łączenie butlast i nthcdr?

+3

powiązane: http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-lista-a-sublist-in-scheme - trzecia odpowiedź poleca podseq, który jest kromka; nie mam pojęcia, czy jest dostępny w emacs seplp choć ... – l4mpi

+1

Ahah! Właśnie tego szukałem, dziękuję. 'subseq' jest, podobnie jak wiele innych Nice Things, dostępny przez' clmacs.el' emacsa. Poza tym, nazwanie go "subseq" jest prawdopodobnie powodem, dla którego wymyśliłem go pustym hasłem. Miałem takie problemy z terminologią, jak to więcej niż raz z emacs. Chcesz odpowiedzieć, abym mógł to zaakceptować? –

+3

Nie zapominaj, że listy 'Pythona' są tablicami, podczas gdy Lispy są połączonymi listami, więc charakterystyki wydajności są bardzo różne. Jeśli potrzebujesz dużo indeksowania i kolejności, szczególnie jeśli lista może być długa, powinieneś używać innego typu w Lisp. (Na przykład fragment Pythona 'mylist [x: y]' to 'O (yx)', podczas gdy odpowiednik Lisp to 'O (y)': dla 'mylist [50000,50005]' oznacza to, że lista będzie miała 10000x wolniej ...) – abarnert

Odpowiedz

19

Jasne jest:

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

Świetnie! Prawidłowa, pomocna odpowiedź znajduje się teraz w Stack Overflow, gdzie Google może ją łatwo znaleźć: wszystko jest w porządku ze światem. :) –

+1

Cieszę się, że mogę służyć całemu światu :-) –

2

Common Lisp library jest wielki, ale jeśli codebase staje się duży i chcesz napisać kod zwięzłą w stylu funkcjonalnym, popieram dash.el bibliotekę, która zapewnia ogromną ilość funkcji na liście i manipulacje drzewem. Istnieje funkcja -slice że zachowuje się jak krojenie Pythona:

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

Argumenty są w kolejności: lista, start, (opcjonalnie) stop (opcjonalnie) krok.

Powiązane problemy