Perlがどういう意味でLispに皮を被せたものなのか
Perlの作者のラリー・ウォールは「動的言語はLispに皮を被せたもの」といいましたが、いったいこれはどういう意味なのでしょうか?
PerlはLispは、表面的には、まったく違うもののように見えます。
Perlの文法
Perlの足し算の文法を書きます。
# Perlの足し算 my $out1 = $x + $y my $out2 = $out1 + 5;
Lispの文法
Lispの足し算の文法。
; Lispの足し算 (+ (+ x y) 5)
Perlがどういう意味でLispに皮を被せたものなのか
Perlがどういう意味でLispに皮を被せたものなのか、比較してみます。
演算子を真ん中に置くのは人間の都合
Perlにはかっこがなく、「+」記号は真ん中に来ています。それに対して、Lispには、かっこがありますね。そして「+」記号が先頭に来ていますね。
Lispの場合は、関数呼び出しも、演算子も先頭に来ます。つまり、命令と呼ばれるものは、常に先頭に来るのです。
実は、「+」記号を真ん中に置くというのは、人間が数学の記法を書くときに、真ん中に書くということが、慣習的に行われているので、見やすいということなのです。
コンピューターの側から見ると、関数呼び出し命令や加算命令というのは、先頭に来るのが自然です。実際、機械語やアセンブラでは、先頭に来るからです。
「+」が真ん中に来るというのは、人間の立場から見た場合の、シンタックスシュガーなのですね。
Lispは構文木自体を実行する
またリスプはかっこのネストになっていますが、これは実際には、構文木自体をを表現しています。
「(+ x y)」というのは、最初の「+」演算の左側のノードとして存在しているのです。そして、最も左下に属するノードから順次実行されていきます。
これは、ちょうどPerlが、コンパイルされて抽象構文木になった後に、最も左下のノードから順次実行されていくということと対応しています。
つまり、Perlは、構文木にコンパイルされると、Lispと同じ構造になります。
Lispは、リストと命令が存在するだけで、プログラムが動くことを証明した
Lispの偉大さは、リストと命令が存在するだけで、プログラムが動くことを証明したとうことです。リストは、動的なデータ構造で、pushとpopを行うことができます。
動的なデータ構造と、命令が存在するとプログラムが動く。おっと、これは、まさにPerlではないですか。
# 関数命令 sub foo { # 動的なリスト my ($num1, $num2, $num3) = @_; }
PerlとLispは、表面的な見た目は、まったく異なりますが、Perlは、人間が使いやすい用にLispに皮を被せたものだったのです。
あらゆる動的言語は、この意味でLispから恩恵を受けているといって過言ではないでしょう。