Lispのコードモードとデータモードの違い

Lispには、コードモードとデータモードの2つのモードがあります。これらのモードは、LispのREPL(Read-Eval-Print Loop)で使われることが多く、Lispの開発環境での開発に役立ちます。

コードモード

コードモードは、Lispのコードを入力するモードです。Lispのコードは、式(Expression)と呼ばれる単位で構成されます。式は、関数呼び出しやリスト、数値、文字列、シンボルなどから構成されます。

コードモードでは、プログラムのコードを入力し、それを評価して結果を得ることができます。式を入力すると、Lispはその式を評価して、式の結果を返します。たとえば、次の式を入力すると、Lisp6という結果を返します。

(+ 2 4)

コードモードでは、入力された式をLispが評価するため、エラーがある場合はエラーが返されます。

この場合、 - +はコマンド(あるいはシンボル) - 1 4はフォーム

という名前が付けられます。

データモード

データモードは、Lispのデータを入力するモードです。データモードでは、コードモードとは異なり、Lispの式を直接入力するのではなく、Lispのデータを直接入力します。

データモードでは、リストやシンボル、数値、文字列などのLispのデータを直接入力することができます。たとえば、次のように入力すると、Lispはリスト(1 2 3)というデータを返します。

'(1 2 3)

データモードでは、式を評価するための機能はありません。代わりに、入力されたデータは、Lispのデータとして直接返されます。これにより、コードモードとは異なり、式を評価することなく、Lispのデータを直接操作することができます。

コンスセルとリスト

次のコード'(1 2 3)は、Lispのリストを表しています。リストは、Lispで最も基本的なデータ構造の1つであり、要素の順序付きコレクションです。 Lispのリストは、コンスセル(Cons Cell)と呼ばれる構造体で構成されています。

コンスセルは、2つの要素(carとcdr)から構成されます。carはリストの最初の要素を表し、cdrはリストの残りの要素を表します。リストは、最初の要素のcarにデータを格納し、残りのcdrには次のコンスセルまたは空のリストを格納することで構成されます。

したがって、次の式は、先頭の要素である1を取得するためにcarを使い、残りの要素である(2 3)を取得するためにcdrを使います。

(car '(1 2 3)) ; 1
(cdr '(1 2 3)) ; (2 3)

リストは、要素の順序が重要である場合に役立ちます。たとえば、数値のリスト(3 1 4 1 5 9)は、円周率を表すことができます。

コンスセルは、リスト以外の様々なデータ構造を構築するためにも使用できます。コンスセルは、任意の2つの要素を格納することができます。これにより、キーワード引数や関数の戻り値などを格納することができます。