2012-11-01 7 views
16

emacs lispに欠けていることは、意外にも、リスト操作の特定のビットです。私はPythonの簡潔なリストスライシングが欠けています。Pythonの[n:m]リストスライスの簡潔なemacs lispがありますか?

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

私はこのようなコードから同じ結果与えるEmacsのドキュメント、内の関数butlastnthcdrを参照してください。

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

は組み合わせよりも、リストのスライスを得るための、より簡潔な方法はありますbutlastおよびnthcdr

+3

関連:http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-list-a-sublist-in-scheme - 第3の答えは、スライス;しかし、emacs lispでも利用可能かどうかは考えられません... – l4mpi

+1

Ahah!それはまさに私が探していたものです、ありがとうございました。 'subseq'は他の多くのNice Thingsと同様に、emacsの' clmacs.el'で利用できます。また、それを "subseq"と呼んでいるのはおそらく、私が空白になった理由です。これはemacsで何度も同じような用語の問題がありました。私はそれを受け入れることができるように答えをしたいですか? –

+3

Python 'list'sは配列であり、Lispはリンクされたリストであることを忘れてはいけません。そのため、パフォーマンスの特性は大きく異なります。特にリストが長くなる可能性がある場合は、多くのインデクシングとサブシーケンスを行う必要がある場合は、Lispで別のタイプを使用する必要があります。 (例えば、Pythonのスライス 'mylist [x:y]'は 'O(yx)'、Lispは 'O(y)'です: 'mylist [50000,50005]'の場合、リストは10000x遅い...) – abarnert

答えて

19

あることを確認:

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

素晴らしい!正しい、有益な答えがStack Overflowにあり、Googleはそれを簡単に見つけることができます。すべてが世界に合っています。 :) –

+1

世界への奉仕に喜んで:-) –

2

Common Lisp libraryは素晴らしいですが、あなたのコードベースが大きくなり、あなたが機能的なスタイルで簡潔なコードを書きたいならば、私は、リストのための機能の膨大な量を提供dash.elライブラリを、是認し、木の操作。

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

引数が順序である:リスト、開始、(オプション)を停止、(オプション)ステップだけで、Pythonのスライスのように振る舞う機能-sliceがあります。

関連する問題