Jak analizujesz
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
Drzewo parsowania prawdopodobnie wygląda jak
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... zserioryzujmy to drzewo do listy, notacja prefiksowa
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Ten format drzewa analizy jest dość łatwy do manipulowania, ale mam jeden problem. Nienawidzę separatorów. Lubię terminatory. Jednocześnie lubię posypywać białe znaki.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... dodatkowe białe znaki utrudniają analizowanie niektórych rzeczy ... Może mógłbym po prostu ustanowić zasadę, że drzewo jest przedstawiane jako (liść liścia korzenia).
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Teraz moją serializacją parsowanego drzewa jest lisp (zmiana nazwy funkcji do zastosowania, i to prawdopodobnie działa). Jeśli chcę programów, które piszą programy, miło jest po prostu manipulować parsowaniem drzew.
Nie do końca tak powstały wyrażenia s, ale zostały wcześnie zidentyfikowane i jest to jedna z funkcji używanych przez programistów Lisp. Nasze programy są w pewnym sensie wstępnie przeanalizowane, a pisanie programów do manipulowania programami jest dość łatwe ze względu na format. Dlatego brak składni jest czasem uważany za siłę.
Ale jak powiedział David, użyj edytora świadomego wyrażania s-wyrażeń. Bardziej prawdopodobne jest, że stracisz śledzenie zamykającego nawiasu klamrowego w wyrażeniu s niż zamykającego nawiasu klamrowego w xml ( </foo>
tylko zamyka <foo>
, ale prawy paren zamyka DOWOLNE wyrażenie s). W przypadku rakiety użycie nawiasów kwadratowych dla niektórych wyrażeń w połączeniu z dobrym stylem wcięcia rozwiązuje większość problemów.
Wersja lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Nieźle.