2012-11-01 12 views
16

Emacs lisp'de kendimi eksik bulduğum bir şey, şaşırtıcı bir şekilde, liste manipülasyonunun bir bitidir. Python'un kısa liste dilimlerini özlüyorum.Python'un [n: m] liste dilimlerinin kısa bir emacs lisp karşılığı var mı?

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

böyle kodundan aynı sonuçları verecek olan fonksiyonlar butlast ve emacs belgelerinde nthcdr bkz:

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

birleştirerek daha liste dilim almanın bir daha özlü bir yolu var mı butlast ve nthcdr?

+3

ilgili: http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-list-a-sublist-in-scheme - üçüncü cevap, aşağıdakileri bir dilim; emacs lisp'de bulunup bulunmadığı hakkında bir fikir yok ... – l4mpi

+1

Ahah! Tam da aradığım şey bu, teşekkürler. "secqq", emacs'ın "clmacs.el" ile elde edilebilen diğer pek çok Güzel Şeyler gibi. Ayrıca, "subseq" diye çağırmak muhtemelen boş bir şekilde neden bu iş için uğraştığımdır - bu tür terminoloji konularını emacs ile bir kereden fazla yaşadım. Cevap vermek ister misin, kabul edebilirim? –

+3

Python 'listesinin diziler olduğunu unutmayın, Lisp'ler bağlı listeler olduğunda, performans özellikleri çok farklıdır. Çok sayıda indeksleme ve takipleme yapmanız gerekiyorsa, özellikle listeler uzun sürebilirse, Lisp'de farklı bir tür kullanmalısınız. (Örneğin, bir Python dilimi olan "mylist [x: y]", "O (yx)", bir Lisp eşdeğeri ise "O (y)": "mylist [50000,50005] için" anlamına gelir. Bu, Listenin 10000x olacağı anlamına gelir. Daha yavaş…) – abarnert

cevap

19

Tabii vardır:

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

Harika! Doğru, yardımcı yanıt şu anda Google'ın kolayca bulabileceği Yığın Taşması üzerindedir: hepsi Dünya ile doğru. :) –

+1

Dünyaya hizmet için sevindim :-) –

2

Common Lisp library harika ama sizin kod tabanı çok büyük hale gelir ve işlevsel bir tarzda özlü kod yazmak istiyorsanız, ben listesi ve fonksiyonlarının çok büyük miktarda içerir dash.el kütüphane, onaylamaz ağaç manipülasyonları.

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

Argümanlar sırayla şunlardır: liste, başlangıç, (isteğe bağlı) dur (opsiyonel) aşaması sadece Python'un dilimleme gibi davranan bir işlev -slice yoktur.

İlgili konular