暑い日が続いていますね^^); とつぜんですがLispの入門記事を始めようと思います。
現在Lispを仕事で使っているプログラマーはどれくらいいるでしょうか? Clojureは現在でも使われているLisp系の言語だと思います。最近はシェアが減っているようですがLispで書かれ、機能拡張にLispを使うエディターEmacsもまだ現役です。しかしメージャーなプログラム言語でないのは確かです。
今までのLisp入門はLisp言語でプログラミングする人向けの入門コースでしたが、これでは今の時代に合っていないと思います。そこで、このLisp入門ではプログラマーの一般教養としてのLispを知る事を目標とした入門記事を書いて行こうと思います。
なぜLispを学ぶべきなのか
過去の話シリーズ(1) 卒業研究でLisp処理系を作ったにも書きましたが、卒業研究でLispに関わったのが私のプログラマー人生の始まりでした。最初からこんなおもしろいプログラム言語に出会えた事は、その後のプログラマー人生に役立つ、とても幸福な経験でした。
さてこれから、詳しく話しますがLispはとてもユニークな言語です、このページの下の方にあるカッコの多い謎の記述がLispのプログラムです。見た目からしてユニークですが見かけだけではなく、いくつものユニークな機能・アイデアを持っています。そして上の画像に書いたようにFORTAN、COBOLとならぶ古いプログラム言語で、後世のプログラム言語に多大な影響を与えてきました。
Lispが持っていたユニークな機能・アイデアは、その後のプログラム言語に引き継がれた物もありますが、引き継がれなかった物もありました。引き継がれた物はJavaScript, Python, Rubyなどを使われている方には直ぐに理解できると思います。
引き継がれなかった物の中にも興味深いものはあります、それはプログラマーのアイデアの引き出しに入れておくと、いつの日か役に立つかもしれません。また全ての言語がLispに向かっているという名言(迷言?)がありますが、将来のプログラム言語で従来は引き継がれなかった機能が復興されるかもしれません。
Lispがもたらしたもの
引き継がれた物には
- 動的言語: インターネット以前には、それほど流行っていなかったと思いますが、現在では動的言語JavaScript, Python, Ruby, PHP… などは主要なプログラム言語です
- ガベージコレクション(garbage collection; GC): プログラマーがメモリ管理をしなくても良いGCは、動的言語はもちろん、JavaやC#, Goなのでも使われています
- 関数型言語: Lispは厳密には関数型言語ではないかもしれませんが関数型言語の元祖です。そしてラムダ式、高階関数、などは近代的なプログラム言語ではほぼ標準的になっていいます。C++やJavaのような(今となっては)古典的な言語にも新しいバージョンではラムダ式などが取り込まれています
引き継がれなかった物
- S式: LispがLispである特徴はS式だと思います。あるLispの大家がS式はLispの魂だとおっしゃっていましたが、この入門でもS式を丁寧に説明して行こうと思います
- データ=プログラム: 現在のコンピュターはプログラム内蔵方式、ノイマン型アーキテクチャです、メモリーにデータもプログラムも(同じように)置かれています。Lispではデータもプログラムも共にS式です、プログラムもデータと同様な扱えるプログラム言語も少ないですが、この性質がマクロ、自己拡張性、DSLなど強力な能力をもたらしています。
S式入門(1)
S式はいろいろなデータ構造を手軽に表す事ができるものです、いくつか例を書きます。
並び(リスト)
()の中に値を空白で区切ったものをリストとよびます、配列のように複数の値を1つのかたまり(値)として扱えます。
(gauche ypsilon mosh)
対応表(連想リスト)
リストの一種ですが、キーと値の組のリストです。
この例は、日本人プログラマーが作ったLisp(Scheme)処理系名と作者の名字の並びです
((gauche . kawai) (ypsilon . fujita) (mosh . minowa))
木構造
木構造は関連を持つデータを表すに良く使われます。下の画像のような木構造は、ネストした2分木を(ノード 左の子 右の子)
というS式で表しています、NILは子要素が存在しない事を表しています。
(A (B NIL NIL) (C (D NIL NIL) (E NIL NIL)))
応用例(HTML)
HTML①を、S式で表すと②のようになります(ー例で、他の表現もありえます)、
この例では、(タグ名 子要素1 子要素2...)
のネストで表しています。
- ①
<html>
<body>
<h1> Lisp </h1>
<table>
<tr><td>1</td> <td>lisp</td></tr>
<tr><td>2</td> <td>scheme</td></tr>
</table>
</body>
</html>
- ②
(html (body
(h1 "Lisp")
(table
(tr (td 1) (td "lisp"))
(tr (td 2) (td "scheme")))))
まとめ
今回はS式のイントロダクションで終わりますが、S式はカッコ()だらけで気持ち悪いと思っていた方にもシンプルで便利そうかな?
と思って頂けたら嬉しいです。次回じっくりとS式を説明したいと思います。