Як ти розбираєшся
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-вираз s). У ракетці використання квадратних дужок для деяких виразів у поєднанні з хорошим стилем відступу усуває більшість проблем.
Версія lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Не дуже погано.