見出し画像

LISP - カッコう、カッコ!

非常に古くから使われ続けているプログラミング言語としてLISPというものがあります。LISPの語源は”LISt Processor”でありリストと呼ばれるデータ同士を繋げただけの構造に対してあれこれ処理をする言語で、いわゆる関数型言語の始祖でもあります。

LISP

その大きな特徴はS式と呼ばれるアトムと呼ばれる基本的な値であるとか名前をカッコで括り、データだけではなくプログラム自身も、この式で表現するのです。さらにLispの処理系自身も殆どの場合Lispで書かれています。

S式

ですからプログラムによってプログラムを作ることも当たり前で、ラムダ計算と呼ばれるモデルを表現するにはうってつけで昔から人工知能の研究には良く用いられていました。

ラムダ計算

LISPの基本構造は (アトム アトム …)で、足し算をするには (+ 1 2 3 4)とやるわけですし、条件文は (if (= (+ 1 2) 3) ‘T ‘F) みたいに書いていくのです。ですからプログラムは至るところカッコだらけになります。

もちろん関数を定義することも出来て、階乗を求めるには

(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))

こんなコードを書くのです(LISPは再帰が大好きです)。

こういう処理をいわゆる普通のコンピュータでやるには少しばかり効率が悪くて専用のハードウェアを作るという試みもありました。

LISPマシン

ただ普通のコンピュータの性能が恐ろしいほど向上したので、もう敢えてLISPのためのハードウェアを作ることは今は無いようです。

歴史の長い言語ですから、非常に多くの解説書も出ているので、もし興味があれば探してみてください。基本的な文法は実にシンプルで動かすだけであれば、あっさりと覚えられると思います。

Lispって何?[Lisp入門の入門]

かなり大昔に(APPLE][時代)に処理系が手に入ったので、覚えてみようかといじったのですが、現実的なコードを書こうとすると入出力に対してのエラー処理を書くのが実に難しく、他の言語で入出力のチェックを済ませてからLISPに投入する羽目になり、少なくともアプリを書く言語ではないなぁと諦めてしまいました。まあリストの最初をとるcarと残りを返すcdrだけは覚えましたが。そうそうLISPでは何かを調べる時に末尾にpを付けた関数を使うという慣習があり、LISPerな人と会話すると日常生活でもlunchp?と聞かれたとか聞かれないとか。

CARとCDR

というわけで避けて通っていたLISPですが、UNIXな時代になりエディタとしてemacsを使うようになると、そうも言っていられなくなりました。

Emacs

このエディタは設定を行ったりマクロを定義するのにLISPが使われており、メールやニュースを読んだり書いたりするには最低限とはいえ、このLISPで書かれた設定を理解して編集する必要がありました。emacsを使う人はキーバインドを始め多くの機能を自分流にカスタムする人が多かったので、他の人が使っている端末で操作をしようものなら、プログラムを終了させることすらままならず、面倒でも元々のマクロ関数を呼び出すことが多かった記憶があります。別にこれだけが原因ではないのですが、よりLISPやemacsが嫌いになってしまいました。今でも必要がない限りvi(vim)を使いemacsは使いません。

今は人工知能もpythonを使うことが多いのですが、論文を追うとLispのコードに出会うことも多いでしょうし、Lispの考え方やラムダ関数なんかは現役です。

そういえば今でこそデータ領域のメモリをコードとして実行しようとするとDEP機能によってプログラムが停止してしまいますが、そもそもどうしてデータ領域の実行が可能であったのかというと、このLISPで書かれたコードがデータとコードの区別をしないためにデータ領域も実行可能にする必要があったからのようです。それだけの影響力のある言語だったわけです。

ヘッダ画像はLispのロゴとLISPマシン。

https://commons.wikimedia.org/wiki/File:Lisp_logo.svg
By Jooja - This file was derived from: Lisplogo.png:, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=96081271


https://commons.wikimedia.org/wiki/File:LISP_machine.jpg
By No machine-readable author provided. Jszigetvari assumed (based on copyright claims). - No machine-readable source provided. Own work assumed (based on copyright claims)., CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=461692

#プログラミング言語 #LISP #アトム #ラムダ #LISPマシン #Emacs  

この記事が気に入ったらサポートをしてみませんか?