2012-11-01 29 views
16

Một điều tôi thấy mình thiếu trong emacs lisp là, đáng ngạc nhiên, một chút cụ thể của thao tác danh sách. Tôi bỏ lỡ danh sách ngắn gọn của Python.Có một emacs ngắn gọn lisp tương đương với các lát danh sách [n: m] của Python không?

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

tôi thấy các chức năng butlastnthcdr trong tài liệu emacs, mà sẽ cung cấp cho các kết quả tương tự từ mã như thế này:

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

Có cách nào ngắn gọn hơn nhận được một danh sách miếng hơn kết hợp butlastnthcdr?

+3

liên quan: http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-list-a-sublist-in-scheme - câu trả lời thứ ba đề xuất subseq là một lát cắt; không có ý tưởng nếu nó có sẵn trong emacs lisp mặc dù ... – l4mpi

+1

Ahah! Đó là chính xác những gì tôi đang tìm kiếm, cảm ơn bạn. 'subseq' giống như nhiều thứ khác của Nice, có sẵn thông qua' clmacs.el' của emacs. Ngoài ra, gọi nó là "subseq" có lẽ là lý do tại sao tôi đã đưa ra Googling trống cho việc này - Tôi đã có các vấn đề về thuật ngữ như vậy nhiều lần với các emacs. Bạn muốn làm một câu trả lời để tôi có thể chấp nhận nó? –

+3

Đừng quên rằng danh sách Python 'là mảng, trong khi Lisp là danh sách liên kết, do đó, các đặc tính hiệu suất rất khác nhau. Nếu bạn cần phải làm rất nhiều chỉ mục và sau đó, đặc biệt nếu danh sách có thể dài, bạn nên sử dụng một loại khác trong Lisp. (Ví dụ, một lát Python 'mylist [x: y]' là 'O (yx)', trong khi một Lisp tương đương là 'O (y)': cho 'mylist [50000,50005]' có nghĩa là Danh sách sẽ là 10000x chậm hơn ...) – abarnert

Trả lời

19

Chắc chắn có:

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

Tuyệt vời! Câu trả lời chính xác, hữu ích hiện có trên Stack Overflow, nơi Google có thể tìm thấy nó dễ dàng: tất cả đều phù hợp với thế giới. :) –

+1

Vui mừng được phục vụ cho thế giới :-) –

2

Common Lisp library là rất tốt, nhưng nếu codebase của bạn trở nên lớn và bạn muốn viết mã ngắn gọn trong phong cách chức năng, tôi tán thành dash.el thư viện, cung cấp số lượng lớn các chức năng cho danh sách và thao tác cây. Có một chức năng -slice mà ứng xử giống như cắt của Python:

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

Các đối số có theo thứ tự: danh sách, bắt đầu, (không bắt buộc) dừng lại, (không bắt buộc) bước.

Các vấn đề liên quan