2009-11-12 24 views
11

リストの最初のn要素を取得するにはどうすればよいですか?Common Lispでリストの最初のn個の要素を取得しますか?

CL-USER> (equal (some-function 2 '(1 20 300)) 
       '(1 20)) 
T 

私は絶対にこれは初心者だと確信していますが、兄弟を助けます。

+8

私は「キスとハグ」がLispよりも多くのプログラマを怖がらせると思います! – beggs

+1

私はあなたを愛しています。 xoxoxoxoxoxoxo –

+0

フロイトはそれについて多くのことを言うだろうと確信しています:-) – beggs

答えて

26

SUBSEQの機能を確認してください。

* (equal (subseq '(1 20 300) 0 2) 
     '(1 20)) 
T 

それはすぐに明らかでないかもしれませんが、Lispで、インデックスは0から始まり、あなたはいつも半開きな間隔を取っているので、この間隔でインデックスを持つリストのすべての要素を取る[0 、2)。

+3

これは、シーケンスが前の長さを求めるのは非常に非効率的なので、残念である終了インデックスよりも小さい場合、実行時に*失敗するという不幸な制限があります。それでは、この場合どのように進めるのですか? –

+0

まあ、Practical Common Lispを見て:http://www.gigamonkeys.com/book/loop-for-black-belts.html正しい答えが来る: '(リスト のリストの項目のためのループ 1から10まで do(something)) 'ここで' something'は 'item'を集めることができます。 –

+1

@DiegoSevillaあなたのリストに十分な要素がないときに、実行時にコードが失敗することがあります。慣用的なCommon Lispコードの多くは、 'DEFCLASS'や' DEFSTRUCT'を使うのではなく、固定サイズのデータ​​構造体を構築します。そのような場合には、十分な要素がなければ、すぐにデバッガに投げ込むのが最適ですあなたに起こり得ること。 – Pillsy

-2

はlispのコマンドラインをダウンロードするために持っていた...しかし:そう

(defun head-x (a b) 
    (loop for x from 1 to a 
     for y = (car b) do 
      (setq b (cdr b)) 
     collect y)) 

(head-x 2 '(a b c d)) 
    '(a b) 
+4

関数本体として '(ループ:repeat a:for x:b:collect x)'を使用してください。ずっと簡単です。 – Pillsy

+1

ありがとう...実際には何もしなかったので、何年も続いた。質問に答えるのは楽しいと思った! – beggs

5

上記の答えは、もちろん完全に正しいですが、これを使用している場合に注意します単に別のリストと比較するためには、単に新しいリストを比較するのではなく、両方のリストをその場で歩く方が効率的です。

例えば、上記の場合には、あなたが言うかもしれない:

(every #'= '(1 20 300) '(1 20)) 
=> t 

愛、

-4

(butlast '(1 20 300)( - (リスト長'(1 20 300)) 2))

機能/マクロにする必要があります。

P.S. This pageが便利かもしれません。関数 'extrude'を参照してください。

+4

正面からいくつかの要素を得るためのリストの長さを計算するのは良い考えではありません。 Unlispy! –

+1

Mmh、合意した。悪いアイデア。 – user233198

関連する問題