你如何解析
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))
这种解析树格式非常易于操作,但是我有一个问题。我讨厌分隔符。我喜欢终结者。同时,我喜欢撒在空白处。
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
嗯...额外的空格使某些内容难以解析...也许我可以做一个规则,将树表示为(根叶叶)。
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
现在我对解析树的序列化是 lisp(重命名要应用的函数,这可能会运行)。如果我想要编写程序的程序,那么只需操纵解析树就可以了。
这并不完全是S表达式的产生方式,但是它是早期发现的,并且是Lisp程序员使用的一项功能。我们的程序在某种意义上是预先准备好的,并且由于格式的原因,编写用于操纵程序的程序相当容易。这就是为什么有时缺乏语法的原因。
但正如David所说,请使用具有S表达式意识的编辑器。与xml中的右括号相比,您更有可能丢失s表达式中的右括号(</foo>
仅closes <foo>
,但right paren会关闭所有s表达式)。在球拍中,某些表达式使用方括号加上良好的缩进样式可以解决大多数问题。
Lisp版本:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
还不错