2012-11-01 3 views
16

Una cosa che mi manca in emacs lisp è, sorprendentemente, un particolare bit di manipolazione delle liste. Mi manca la lista concisa di Python che affetta.Esiste un conciso emacs lisp equivalente alle porzioni di lista [n: m] di Python?

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

vedo le funzioni butlast e nthcdr nella documentazione di Emacs, che darebbe gli stessi risultati da codice come questo:

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

c'è un modo più conciso di ottenere una fetta lista che unire butlast e nthcdr?

+3

correlati: http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-list-a-sublist-in-scheme - la terza risposta consiglia subseq che è una fetta; non ho idea se sia disponibile in emacs lisp però ... – l4mpi

+1

Ahah! Questo è esattamente quello che stavo cercando, grazie. 'subseq' è, come molte altre cose belle, disponibile attraverso' clmacs.el' di emacs. Inoltre, chiamarlo "subseq" è probabilmente il motivo per cui mi sono imbattuto su Google per questo - ho avuto problemi di terminologia più di una volta con emacs. Vuoi fare una risposta così posso accettarla? –

+3

Non dimenticate che Python 'list's sono array, mentre i Lisp sono elenchi concatenati, quindi le caratteristiche delle prestazioni sono molto diverse. Se hai bisogno di fare molte indicizzazioni e sequenze, specialmente se le liste possono essere lunghe, dovresti usare un tipo diverso in Lisp. (Ad esempio, una slice Python 'mylist [x: y]' è 'O (yx)', mentre un equivalente Lisp è 'O (y)': per 'mylist [50000,50005]' questo significa che Lista sarà 10000x più lento ...) – abarnert

risposta

19

che ci sia:

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

Ottimo! La risposta corretta e utile è ora su Stack Overflow in cui Google può trovarlo facilmente: tutto è giusto con il mondo. :) –

+1

Felice di essere al servizio del mondo :-) –

2

Common Lisp library è grande, ma se il vostro codice di base diventa grande e si desidera scrivere codice conciso in stile funzionale, mi approva dash.el biblioteca, che offre un'enorme quantità di funzioni per la lista e manipolazioni di alberi. C'è una funzione -slice che si comporta proprio come affettare di Python:

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

Gli argomenti sono in ordine: lista, avviare, (opzionale) stop, (opzionale) passo.