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
?
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
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? –
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