GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/nthcdr.html ・ emacs-doc.conao3.com

7.3 nthcdr

nthcdr 関数は cdr 関数に関連付けられています。この関数は、リストの CDR を繰り返し取得します。

リスト (pine fir oak maple) の CDR を取ると、リスト (fir oak maple) が返されます。返されたリストに対してこれを繰り返すと、リスト (oak maple) が返されます。(もちろん、元のリストに対して繰り返し CDR を行っても、関数がリストを変更しないため、単に元の CDR が得られるだけです。CDR の CDR をさらに評価していく必要があります。)これを続けると、最終的に空のリストが返されます。この場合、() ではなく nil として表示されます。

確認用に、繰り返し出現する一連のCDRを以下に示します。‘⇒’に続くテキストに、返される内容が表示されています。

(cdr '(pine fir oak maple))
     ⇒ (fir oak maple)

(cdr '(fir oak maple))
     ⇒ (oak maple)

(cdr '(oak maple))
     ⇒ (maple)

(cdr '(maple))
     ⇒ nil

(cdr 'nil)
     ⇒ nil

(cdr ())
     ⇒ nil

また、次のように、途中の値を出力せずに複数のCDRを記述することもできます。

(cdr (cdr '(pine fir oak maple)))
     ⇒ (oak maple)

この例では、Lispインタプリタはまず最内層のリストを評価します。最内層のリストはクォートされているため、そのままの状態で最内層のcdrに渡されます。このcdrは、リストの2番目以降の要素からなるリストを最外層のcdrに渡し、これにより元のリストの3番目以降の要素からなるリストが生成されます。この例では、cdr関数が繰り返し呼び出され、元のリストから最初の2つの要素を除いたリストを返します。

nthcdr 関数は、cdr の呼び出しを繰り返すのと同じ動作をします。以下の例では、引数 2 がリストと共に関数 nthcdr に渡され、返される値はリストの先頭 2 項目を除いたものになります。これは、リストに対して cdr を 2 回繰り返すのと全く同じ結果になります:

(nthcdr 2 '(pine fir oak maple))
     ⇒ (oak maple)

元の4要素のリストを用いて、0、1、5を含むさまざまな数値引数をnthcdrに渡した場合に何が起こるかを確認してみましょう:

;; Leave the list as it was.
(nthcdr 0 '(pine fir oak maple))
     ⇒ (pine fir oak maple)

;; Return a copy without the first element.
(nthcdr 1 '(pine fir oak maple))
     ⇒ (fir oak maple)

;; Return a copy of the list without three elements.
(nthcdr 3 '(pine fir oak maple))
     ⇒ (maple)

;; Return a copy lacking all four elements.
(nthcdr 4 '(pine fir oak maple))
     ⇒ nil

;; Return a copy lacking all elements.
(nthcdr 5 '(pine fir oak maple))
     ⇒ nil