Bagaimana Anda menguraikan
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
Pohon parse mungkin terlihat seperti itu
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... mari membuat serial pohon ini menjadi daftar, notasi awalan
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Format pohon parse ini cukup mudah untuk dimanipulasi, tapi saya punya satu masalah. Saya benci pemisah. Saya suka terminator. Pada saat yang sama, saya suka menaburkan di ruang putih.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... spasi putih tambahan membuat hal-hal tertentu lebih sulit diurai ... Mungkin saya bisa membuat aturan bahwa pohon itu direpresentasikan sebagai (daun akar daun daun).
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Sekarang serialisasi pohon parse saya adalah lisp (ganti nama fungsi untuk diterapkan, dan ini mungkin berjalan). Jika saya ingin program yang menulis program, senang rasanya memanipulasi pohon parse.
Ini tidak sepenuhnya bagaimana s-ekspresi muncul, tetapi itu diidentifikasi awal, dan itu adalah salah satu fitur yang digunakan programmer cadel. Program kami sudah dipra-parsing dalam beberapa hal, dan menulis program untuk memanipulasi program cukup mudah karena formatnya. Itu sebabnya kurangnya sintaksis terkadang dianggap sebagai kekuatan.
Tetapi seperti yang dikatakan David, gunakan editor penyadaran ekspresi-s. Anda lebih cenderung kehilangan jejak kurung kurawal dalam ekspresi-s daripada kurung kurawal dalam xml ( </foo>
hanya tutup <foo>
, tetapi paren kanan menutup APAPUN ekspresi-APAPUN). Dalam raket, penggunaan tanda kurung siku untuk beberapa ekspresi, ditambah dengan gaya indentasi yang baik, memperbaiki sebagian besar masalah.
Versi lisp:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Lumayan.