2012-11-01 5 views
16

Eine Sache, die ich in Emacs Lisp fehlt fehlen, ist, überraschenderweise, ein bestimmtes Stück Listenmanipulation. Ich vermisse Pythons knappes Listen-Slicing.Gibt es ein prägnantes Emacs Lisp-Äquivalent von Pythons [n: m] Listen-Slices?

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

Ich sehe die Funktionen butlast und nthcdr in der Emacs-Dokumentation, die die gleichen Ergebnisse von Code wie folgt geben würde:

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

Gibt es eine prägnante Art und Weise eine Liste Scheibe immer als Kombination butlast und nthcdr?

+3

bezogen: http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-list-a-sublist-in-scheme - die dritte Antwort empfiehlt subsq, die ist Eine Scheibe; keine Ahnung, ob es in Emacs Lisp verfügbar ist ... – l4mpi

+1

Ahah! Genau das habe ich gesucht, danke. 'subsequq' ist, wie viele andere Nice Things, über emacs' clmacs.el' verfügbar. Es ist wahrscheinlich auch der Grund, warum ich "Googeln" genannt habe - ich hatte solche Terminologieprobleme mehr als einmal mit Emacs. Willst du eine Antwort geben, damit ich es annehmen kann? –

+3

Vergessen Sie nicht, dass es sich bei Pythons Listen um Arrays handelt, während es sich bei Lisp um verkettete Listen handelt, die Leistungsmerkmale sind also sehr unterschiedlich. Wenn Sie viel Indexierung und Subsequenzierung durchführen müssen, insbesondere wenn die Listen lang sein können, sollten Sie in Lisp einen anderen Typ verwenden. (Zum Beispiel ist ein Python-Slice 'mylist [x: y]' 'O (yx)', während ein Lisp-Äquivalent 'O (y)' ist: für 'mylist [50000,50005]' bedeutet dies, dass List 10000x ist langsamer ...) – abarnert

Antwort

19

Sicher gibt es:

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

Großartig! Die richtige, hilfreiche Antwort finden Sie jetzt bei Stack Overflow, wo Google es leicht finden kann: Alles passt zur Welt. :) –

+1

Froh, der Welt zu Diensten zu sein :-) –

2

Common Lisp library groß ist, aber wenn Ihre Code-Basis groß wird, und Sie wollen kurzen Code in funktionalem Stil schreiben, ich unterstütze dash.el Bibliothek, die enorme Menge an Funktionen für die Liste liefert und Baummanipulationen. Es gibt eine Funktion -slice, die genau wie Slicing Python verhält:

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

Argumente sind in der Reihenfolge: Liste, starten (optional) stoppen, (optional) Schritt.