2013-07-18 29 views
5

私はCommon-Lispでこの最初/最後のことを得ていません。はい、私はそれが動作する方法を参照してください、しかし、私はそれがそのように動作する理由を取得しません。Common Lisp:最初に最初に戻りますが、最後に最後のリストを返しますか?

基本的に、リストの最初の項目を取得するには、(first mylist)を使用できます。しかし、私が最後のアイテムをしたい場合、(last mylist)はそれを私に与えません。代わりに、それは私に私のリストの最後の項目を含むリストを与える!

(私はClozure-CLを使用していますが、これはバグのようなものですが、私はLisp-n00bなので、古いものにならないようにしようとしています。 !だから、

に)」トリック:)壊れて、例えば:

? (setq x '((1 2) (a b))) 
=> ((1 2) (A B)) 

? (first x) 
=> (1 2) ; as expected 

? (last x) 
=> ((A B)) ; why a list with my answer in it?! 

? (first (last x)) 
=> '(A B) ; This is the answer I'd expect from plain-old (last x) 

誰かが最後にこれを行い、なぜ私が理解するのに役立つことはできますか?これらのアイテムを間違って使用していますか? firstは本当に奇妙なボールですか?

ありがとうございます! Common Lispのlast

+0

Doing '('(1 2) '(a b))は実際には意味がありません。代わりに '((1 2)(a b)))を使用してください。あなたが書いたものは、以下のリストを作成します:((quote(1 2))(quote(a b)))。ここで2つの見積もりは、あなたが意味する特別な演算子として解釈されるのではなく、同じ名前を持つ普通の古いシンボルだけが解釈されます。私が何を評価しているのかを知るには(最初の(最初の( '(1 2)'(a b)))))REPLに入れてください。 QUOTEを返します。 –

+0

トーマス:あなたは正しいです。ソースが編集されました。 – Olie

答えて

8

documentationから、リストを返すことになっている。

last list &optional n => tail 
list---a list, which might be a dotted list but must not be a circular list. 
n---a non-negative integer. The default is 1. 
tail---an object. 

最後の戻りをリストの最後のNコンス(いない最後のn個の要素)。 list is()の場合、lastは()を返します。例えば

(setq x (list 'a 'b 'c 'd)) 
(last x) => (d) 

そして、はい、これは直感に反するです。名前の通り、それは働くのLispの他のフレーバーでは、例えばラケット(スキームの方言)で:

(define x '((1 2) (a b))) 
(first x) => '(1 2) 
(last x) => '(a b) 

(define x (list 'a 'b 'c 'd)) 
(last x) => 'd 
+1

他の例ではOK、受け入れてくれてありがとう。最初の/最後の不一致が残りの言語と比較して非常に控えめであるように見えるので、私はちょうど重要な点を欠落していないことを確認したいと思っていました(しかし、Kaz [f]/set [f]あまりに:)) – Olie

4

Common Lispのmisnamed機能lastはあなたの最後の短所を与えます。

おそらくtailと呼ばれるはずですが、機能がtailpであると思いますが、私の推測では、この名前は履歴/互換性の理由で固まっています。

一般的に、それはあなたのリストの終わりまでにリストのn番目の尾、またはn番目の短所を与えます。

4

これはまさにそれです。 firstおよびlastは相補的な演算のペアではありません。 lastは、restおよびnthcdrにさらに密接に関連しています。また、butlastは、指定されたリストの最後の項目を省略した新しいリストを作成します。 last

firstgetgetfsetsetfとは何の関係もありませんどのように比べて何もありません。

+0

LOL:最初と最後の間<=> [f]対セット[f] - ええ!それは、彼らが意図的にn00bsの頭を乱すようにしたようなものです! – Olie

6

最後の要素を返すことは、最後の要素にアクセスする以外はあまり役に立ちません。それでも(car (last x))として最後の要素にアクセスすることができますが

(let ((x (list 1 2 3))) 
    (setf (cdr (last x)) '(4)) 
    x) 

=> '(1 2 3 4) 

:最後の短所を返すことは、あなたがこのような何かを行うことができます。

+0

これは便利です。私はちょうど私がボートを完全に欠けていなかったことを確認したいと思う。 – Olie

関連する問題