Как вы разбираете
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. Наши программы в некотором смысле предварительно анализируются, и написание программ для манипулирования программами довольно легко из-за формата. Вот почему отсутствие синтаксиса иногда считается сильной стороной.
Но, как сказал Дэвид, используйте редактор с поддержкой s-выражений. С большей вероятностью вы потеряете след закрывающей фигурной скобки в s-выражении, чем закрывающей фигурной скобки в xml ( </foo>
только закрывается <foo>
, но правая часть закрывает ЛЮБОЕ s-выражение). В рэкетах использование квадратных скобок для некоторых выражений в сочетании с хорошим стилем отступа решает большинство проблем.
Версия LISP:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Не плохо.