NILは空リストなので当然リストだ。コンスセルではない(0個のコンスセルと言っても良い)。したがって、アトムでもある。本当に空でアクセスすると例外となるJavaのnullとは異なる。NullObjectパターンの実装を考えると、より近いものとなる。}}NILクラスの導入により、元のConsCellクラスの実装は以下となる。}}Lispのプログラムは、これらのオブジェクトを利用して記述する。以下のプログラムは1と2を加えた結果を返す(Lispは最後に評価した結果を返す)。←結果このプログラムは、概念的には(実際には機械語などにコンパイルされるからだが)、以下のようにコンパイルされる。m.invoke(elem2);すべてのリストは先頭要素で指定した関数に対して、2番目以降の要素を引数とした関数呼び出しとなる(マクロに展開されることもある)。関数を呼び出して結果で置き換えることを「評価」と呼ぶ。先頭に「'」(クォート)を付けてクォートすると評価をスキップできる。2)なぜ、この仕組みが「メタプログラミングテクニックに都合の良いコーディング」なのだろうか。それは、プログラムが最初からリスト(というデータ構造)で示されているからだ。ほとんどのプログラミング言語は、テキストとして記述されたプログラムを処理系が内部で処理する。かりにソースをプログラムから操作したい場合、それはテキスト処理となる。それに対してLispではソースをプログラムから操作したい場合、それはリスト処理となる。Lispは元々リスト処理に特化した言語である。したがって、メタプログラミングテクニックに都合が良いのは当然である。Java6のジェネリクス今日のコンパイルエラー。名前が競合しています。削除後の名前が同じです。名前が競合しています。削除後の名前が同じです。