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から恩恵を受けているといって過言ではないでしょう。

関連情報