Nasıl ayrışırsın
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
Ayrıştırma ağacı muhtemelen
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
hmm ... hadi bu ağacı listeye serelim, ön ek gösterimi
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
Bu ayrıştırma ağacı biçiminin kullanımı oldukça kolaydır, ancak bir sorunum var. Ayırıcılardan nefret ediyorum. Sonlandırıcıları severim. Aynı zamanda boşlukta serpmeyi seviyorum.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
hmm ... ek boşluk bazı şeyleri ayrıştırmayı zorlaştırıyor ... Belki de sadece ağacın (kök yaprak yaprak yaprağı) olarak temsil edildiği bir kural yapabilirim.
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
Şimdi bir Çözümleme ağacının benim seri olan lisp (uygulamak için yeniden adlandırma işlevi ve bu muhtemelen çalışır). Program yazan programlar istiyorsam, ayrıştırma ağaçlarını manipüle etmek çok hoş.
Bu tamamen s-ifadelerinin nasıl ortaya çıktığı değil, erken teşhis edildi ve lisp programcılarının kullandığı bir özellik. Programlarımız bir anlamda önceden ayrıştırılmıştır ve formatları nedeniyle programları değiştirmek için program yazmak oldukça kolaydır. Bu yüzden sözdiziminin eksikliği bazen bir güç olarak kabul edilir.
Ama David'in dediği gibi, s-ifade farkında bir editör kullanın. Bir s ifadesinde kapanış ayracı izini kaybetme olasılığınız, xml'de bir kapanış ayracıdır ( </foo>
yalnızca kapanır <foo>
, ancak sağ paren HERHANGİ bir s ifadesini kapatır). Rakette, iyi girinti stili ile birleştiğinde bazı ifadeler için köşeli parantez kullanımı çoğu sorunu çözer.
Lisp sürümü:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
Çok kötü değil.