LISP の名前は「list processor」に由来します。
要するにリストを処理するプログラミング言語です。
リストを入力して、それを処理して、リストを出力します。
一般的なプログラミング言語の場合:
入力データ → [処理] → 出力データ
これが情報処理(プログラミング)の基本ですよね。
でもちょっと待ってください。
LISP の場合は、データはすべてリストです。
実は、処理もリスト*1です
LISPの場合:
入力リスト → [リスト] → 出力リスト
LISP において、コードとは、
リストを入力し解釈してリストを出力するリスト。
となります。みんなリストです。
他言語で言う「処理(コード)」もリストなので、入力が他言語で言う「処理(コード)」でも良いのです。もちろん、出力が他言語で言う「処理(コード)」にもなりえます。
他言語のために書いてみますが:
入力コード → [コード] → 出力コード
は LISP では普通にできます。
「コードを入力して解釈しコードを出力するコード」が簡単に書けます。
先にも言ったとおり、LISP ではデータもコードもリストだからです。
LISP では:
データ = コード = リスト
ですから、
データを入力して解釈しデータを出力するデータ
コードを入力して解釈しコードを出力するコード
は、なんの問題もありません。
コードを入力して解釈しコードを出力するデータ
コードを入力して解釈しデータを出力するコード
コードを入力して解釈しデータを出力するデータ
データを入力して解釈しコードを出力するコード
データを入力して解釈しコードを出力するデータ
データを入力して解釈しデータを出力するコード
すべての組み合わせも実現可能!
(リストを言い替えただけですし)
なぜなら LISP では
データ = コード = リスト
であり区別しないからです。
そして LISP はリストを処理する言語です。
処理はコードじゃなければいけないなんて、誰が決めたんですか?
入力がデータじゃなければいけないなんて、誰が決めたんですか?
出力がデータじゃなければいけないなんて、誰が決めたんですか?
そんな決まりを作ってしまうからプログラムの柔軟性が損なわれるのではないですか?
LISP では
データ = コード = リスト
です。リストを処理する言語。それが LISP です。
この柔軟さが「パワー」を生み出すわけです。
一つ例を挙げると、LISP は LISP だけで LISP が実装できます。
「ソフト」ウェアって言うぐらいですから、柔軟じゃなきゃダメでしょう?
あなたの使っているその言語は石みたいに硬いですよ。
そして、その言語を使うあなたの頭は、固定観念でカチカチなのでしょうね。
石のように。
*1:S式と呼ばれます