どのように解析しますか
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
解析ツリーはおそらく次のようになります
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
うーん...このツリーをリストにシリアル化しましょう、プレフィックス表記
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
この解析ツリー形式は操作が非常に簡単ですが、問題が1つあります。セパレーターが嫌いです。ターミネーターが好きです。同時に、空白をふりかけるのも好きです。
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
うーん...追加の空白文字は特定の事柄を解析するのを難しくします...多分私は木が(ルートリーフリーフリーフ)として表されるというルールを作ることができたでしょう。
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
現在、パースツリーのシリアル化は lispです(関数の名前を変更して適用すると、おそらくこれが実行されます)。プログラムを作成するプログラムが必要な場合は、構文解析ツリーを操作するだけでいいです。
これはs-expressionsがどのようにして生まれたのかというわけではありませんが、早期に特定されたものであり、lispプログラマーが使用する機能の1つです。私たちのプログラムはある意味で事前に解析されており、プログラムを操作するためのプログラムの作成は、その形式のおかげでかなり簡単です。そのため、構文がないことが強みと見なされることがあります。
しかし、Davidが言ったように、s-expression対応のエディターを使用してください。xmlの閉じ中かっこよりも、s式の閉じ中かっこを見失う可能性が高くなり</foo>
ます(<foo>
close のみですが、右かっこはすべてのs式を閉じます)。ラケットでは、いくつかの式に角かっこを使用すると、適切なインデントスタイルと相まって、ほとんどの問題が修正されます。
LISPバージョン:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
悪くない。