Powered by SmartDoc

lisp の言葉

lispには、lisp固有の言葉使いがあるので、これからlispを学ぶ上で、これらの言葉を予め覚えておく(6)と良いでしょう。

  1. 以下の説明では、所々、解り易さを優先するために、正確さに欠ける表現が含まれている。詳しくは、各自、書籍やWeb等を当って欲しい。

    なお、この講義で、演習をする分には、以下の内容をとりあえず、信じておいて構わない。

lisp での文字の種類

lispでは、文字の種類によって、固有の意味があります。実は色々とあるのですが、まず、区別して欲しいのは、次の3種類です。

空白文字

空白(7)、タブコード([Tab]キーで入力する)、改行コード([Enter]キーで入力する)は、原則として、一つ以上、いくつ並んでも、一つの空白と同じ意味になります。

ただし、対応する括弧が全て閉じている状態での改行コードの入力( [Enter]キーを押す)は、(すでに、経験している通り.. ) Lispへの指示(8)と解釈されます。

括弧
左[開き]括弧"("と右[閉じ]括弧")"は、常に対で利用され、それぞれ単独で意味を持ちます。"(("のように、間に空白文字を置かずに続けて括弧が書いてあった場合(9)でも、これは、飽くまでも、左括弧が二つあるものとみなされます。
英数字

英数字(10)は、次に述べるatomを作る材料になります。

一般に英数字の並び(途中に空白を含めずに、英数字を並べたもの)がatomになります。

なお、演算記号( "+", "-", "/", "*", "%"等)は、原則として、英字と同じようにして扱われます。

特に、数字(と、必要に応じて、負の符号を表す"-",小数点を表す"." [ピリオド]、あるいは、分数を表す"/"を一つだけ含めても良い)を空白を入れずに並べたものは、「数(数値atom)」として扱われます。

クオート
シングルクオート記号"'"も、単独で、特別な意味をもちます。これに関しては、もう一度、「シングルクオート」のところで、説明しますので、ここでは、英数字、括弧、空白とは異なる種類の文字だということだけを理解していてください。
  1. 漢字は許されない。xlispでは、日本語は利用できないと思っていて欲しい。
  2. 後に述べるように、lispに対する、「S-式を評価しなさい」という命令となる。これを、「eval (エバる)」と言うこともある。
  3. 括弧以外の場合、例えば、数字や文字などは、間に空白があれば、それぞれ別のもの、間に空白がなければ、同じものの一部と解釈されるので、これは、かなり特殊な状況であると考えてよいでしょう。
  4. ここでも、「半角英数字」、つまり、日本語(全角文字)でないものを対象にしていることに注意してください。

atom (アトム)

atom (アトム)(11)は、上記で述べたように、基本は、「空白を含まない、英数字の並び(ただし、数値の場合は、小数点を表す"."や、分数を表す"/"が一つ含まれても良い)」と考えます。実際には、これ以外のパターンもありますが、しばらくは、atomとはこのようなものと思ってください。

atomは、更に、利用のされ方によって、次の2種類に分けられます。

数値atom
数字ならびに、負の符号を表す"-",小数点を表す"." (ピリオド),分数を表す"/"だけからなるatomで、これは、数値を表しています。
symbol (シンボル) atom

英字から始まり、英数字または、演算記号からなる文字列で、空白や括弧、シングルークオートを含まない文字列のことを言います。

これは、一般に、「名前」として利用されます。

  1. atom :これ以上、分割できないもの..日本語の別の訳語として「原子」がある。

    Lispでは、これ以上分割できない「単位」となるものの総称がatomであり、これから組み立てられるものが全てListになるわけである。

    余談だが、物理の世界の原子は、実はまだ分解可能で、それらが素粒子という更に細かいものから成ることが分かったが、Lispの世界でも、実は、atomが分解できて...という話は、この資料の範囲を超えるので省略。興味のある人は、Webや専門書を当たろう。

list (リスト)

list (リスト)は、lispの中心となる表現です。listは、次のように「再帰的に定義」されます。

listの定義
0個以上のatomあるいはlistを、空白を挟んで、並べ、左括弧と右括弧で挟んだものをlistと呼ぶ。
listの長さ
左括弧と右括弧の間にある、atomあるいはlistを、このlist全体の「要素」と呼び、その要素数を「listの長さ」と呼ぶ。

ここで、「再起的」と呼んだのは、この( list )定義の中に、listが利用されているからです。これでは循環論法に見えるのですが、実際には、問題ありません(12)

以下に、listの例をいくつか、挙げておきます。

"()":空(くう)リスト
左括弧と右括弧の間には何も入っていない、特別なlist (要素数が0 )。
"( ringo banana mikan )"
三つのatom [ "ringo", "banana", "mikan" ]を要素として持つlist。
"( + 3 ( * 4 5 ) )"
二つのatom [ "+"と"3" ]と、一つのlist要素[ "( * 4 5 )" ]を含むlist。
"( (a b) (c d (e f)) )"
二つのlist要素[ "(a b)"と"(c d (e f))" ]からなるlist。二つめのlistは更に、list要素を持っていることに注意。
  1. 括弧の数がどんどん減って行き、最後に要素に含まれる括弧の数が0 (つまりatom )になるので、問題ないわけです。

    ペアノによる自然数の定義( 0は自然数、nが自然数ならn + 1も自然数)をほうふつさせると思います。lispでは、0に相当する要素がatomでそれ以外はlistなわけですね。

S-式

S-式というのは、lispで扱われるようなデータ全部のことです。

単純に言えば、atomとlistの総称と考えてよいでしょう。