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 butlast
và nthcdr
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 butlast
và nthcdr
?
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
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ó? –
Đừ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