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