Assyのリベラル文学研究所もご覧ください。

Lisp

Lisp

S式によるカッコを多用したプログラミングでおなじみの、Lispについて。
人工知能の研究で使われることが多い。(最近は、人工知能Pythonのライブラリが豊富でもある。)
Emacs Lispと言う、テキストエディタEmacsの拡張言語として採用されていることで有名で、EmacsLispによってコマンドシェルからメールクライアントまで、何でも出来る万能アプリケーションになる。
コンパイラが作りやすいことで有名で、たくさんの方言がある。主に使われているのは、Common LispSchemeである。
あまり使われていないが、GNU公式のマクロ拡張言語として、Guileがある。

プログラム自身をS式のデータにできる

Lispでは、プログラム自身がS式と呼ばれる「括弧をたくさん使うリスト型のデータ」にすることができます。
これは、Lispの持つ、「プログラム自身をデータにできる」という強力な特徴です。
たとえば、Emacs Lispでは、Emacsというテキストエディタの中で、Lispをマクロとして実行できます。このため、Lispを使って「Emacsを拡張する」ことができます。
また、プログラムをデータとして扱うことで、人工知能・AIの開発にも、大きくLispは貢献しています。
こうしたプログラムをデータとして扱うのは、数学的です。たとえば、足し算が1+2=3である時、1と2と3はデータであり、必要なのは+という「基本となる関数」だけである、ということが言えます。Lisp的には、(+ 1 2)という簡単なS式でこのプログラムを表現できると同時に、この(+ 1 2)それ自体がひとつのS式によるデータであり、このデータを他の関数に送ったりするなどが可能です。プログラム=データ、という発想がLispの根底にあると言えるでしょう。
また、Lispの神髄は、ただプログラムをデータとして扱えるだけではなく、「データを作成するように、プログラムを作成できる」ということです。プログラムからプログラムを作成することが簡単にできる、これが、Lisp人工知能・AIとの親和性が高い理由です。

Common Lispの基本

ANSI Common Lisp (スタンダードテキスト)を参考に執筆しました。
Lispでは基本的に前置記法でオペレータを書く。以下は足し算の例。

(+ 4 10 3)

これは4 + 10 + 3を意味する。
Lispでは括弧をいくらでも入れ子にできる。

(+ 4 (- 10 5) (/ 3 2))

Lispでは、まず引数が左から右へと評価される。その後に、式の第一要素(オペレータ)の名前の関数に渡される。これを評価ルールという。Common Lispでは、オペレータはその全てが関数ではないが多くが関数である。
評価ルールに従わないオペレータにquoteがある。quoteオペレータは特殊オペレータであり、別の評価ルールを持っている。そのルールは「何もしない」である。quoteオペレータは1つの引数をとり、それを同じままで返す。

> (quote (+ 10 3))
(+ 10 3)

Common Lispではquoteを省略形である'で書く。

'(+ 10 3)

Lispは、式を評価から「保護」する方法としてquoteを用意している。
Lispでは、データ型にいくつかの種類がある。まず、整数は「256」のように数値の並びによって表現する。ストリング(文字列)は「"test"」のように二重引用符で表現する。
シンボルは単語であり、タイプ入力時の文字にかかわらず大文字に変換される。

> 'Test
TEST

そして、リストは0個以上のかっこでくくった形で表現する。リストには引用符をつけなければならない。なぜなら、そうしなければLispはそれを関数呼び出しとみなしてしまう。

> '(test 2 "Test")
(TEST 2 "Test")

1つの引用符で、式の内部の式を含めて式全体が保護される。
listを呼び出すことでリストが作れる。listは関数なので、引数が評価される。

> (list 'test (+ 10 2) "Test")
(TEST 12 "Test")

Lispの特徴として、Lispプログラムはリストとして表現される。この特徴のために、LispプログラムではLispコードが作成できる。Lispプログラマは、プログラムを書いてくれるプログラムが書ける。
quoteの省略形として'が使えるように、functionの省略形として#'が使える。functionに関数名を与えると、その関数名と結合したオブジェクトが返ってくる。

Lispは拡張性豊かな言語

Lispは拡張性豊かな言語である。まるで「プログラミング言語を作る」かのように、関数やマクロでLisp自体を拡張していける。
ボトムアップアプローチで、まず「Lisp言語を作り」、その上で「作った言語でプログラムを書く」といったことが可能になる。
また、Lisp関数型言語であり、「関数を返す関数」のようなものが簡単に書ける。
Lispは素早いインプリメントを可能とし、プランの際に絶対的な正しい仕様を書けなくても、プラン自体を小さくし、少ない時間でインプリメントを行うことができる。
このような特徴のため、C++を学ぶことでBASICが使いづらいものになるように、Lispを学ぶことでC++が使いづらいものになる。

簡単な説明

関数型言語

  • 関数型言語
    • Haskell
      • 「できることが制限された言語」として知られる
      • 理解すると人生が変わるらしい。悟りが開けるとか
      • ミュータブル、イミュータブル
      • パターンマッチング、ガード
    • OCaml
      • F#
    • Lisp
      • S式
        • かっこをたくさん使うLisp特有の記法
        • プログラムコードとリスト式のデータを同等に扱うことができるという利点がある
      • 関数とマクロ
        • Lispでは一部を除いて全てが関数あるいはマクロ
      • リスト
        • プログラムコードと同様だが、'(クオーテーション)をつける
      • eval
      • 自分の言語を作り、その言語でプログラムを書く