<p>我并沒有去專門為了Lisp使用前綴表達式而去網(wǎng)上尋找鼓吹有關(guān)此方面的文章或書籍芽腾。我也并不是Lisp的狂熱愛好者端幼。學(xué)習(xí)Lisp最初只不過是學(xué)習(xí)其偉大思想辫樱。
不過當(dāng)我慢慢學(xué)過Lisp一段時間之后匹摇,我慢慢的發(fā)自內(nèi)心的喜歡上了它甲葬。我用的是Scheme廊勃,一個教學(xué)用的語言经窖。當(dāng)然對于其使用的前綴表達式我也想說一下我自己的認識坡垫。</p>
<p>先說一點:前綴表達式也可以叫波蘭式,后綴表達式也可以叫逆波蘭式画侣。</p>
<p>上過數(shù)據(jù)結(jié)構(gòu)課,我們都知道前綴配乱、中綴和后綴表達式分別對應(yīng)的表達式樹的先序、中序和后續(xù)遍歷宪卿。也就是說前綴的诵、中綴和后綴表達式這三者可以互相轉(zhuǎn)換的。</p>
<p>
<small>比如:</small>
</p>
<ul>
<li>中綴:1 + 2 + (3 + 4) * 5 + 6 + 7</li>
<li>后綴:1 2 + 3 4 + 5 * + 6 + 7 +</li>
<li>前綴:+ + + + 1 2 * + 3 4 5 6 7</li>
</ul>
<p>很多人是很不適應(yīng)甚至反感前綴表達式的佑钾,因為很不習(xí)慣西疤,我們從小學(xué)習(xí)數(shù)學(xué)休溶,學(xué)習(xí)基本的四則運算扰她,好像數(shù)學(xué)都是用的中綴表達式芭碍。真的是這樣子嗎!</p>
<p>其實不是的窖壕,在四則運算加減乘除以外的世界,其實都是用的前綴表達式瞻讽,舉個例子,比如根號√4晌砾,這是在數(shù)學(xué)再常見不過的求根表達式了。它就是一個前綴表達式养匈。
根號在最前面都伪。當(dāng)然根號是個一元運算符,根號里面的被視為一個整體院溺,對整體求值磅轻。</p>
<p>在舉一個例子,比如令許多人頭疼的積分∫谆膳。它也是前綴表達式撮躁,積分符號∫在各個參數(shù)的最前面漱病。 </p>
<p>現(xiàn)在看來把曼,數(shù)學(xué)書上就是在用前綴表達式,大家也都可以適應(yīng)注盈,為什么到了編程中就不怎么適應(yīng)了……</p>
<p>當(dāng)然更坑爹的是逆波蘭式:比如Pascal中定義變量var x : real;
或者近來的年度語言Golang的定義變量var x float叙赚。(順便說一句僚饭,之前看過王垠的博客胧砰,它也不喜歡go的這種定義變量方法)
大家習(xí)慣的是比如double x;這樣子的定義變量方法。</p>
<p>當(dāng)然有些時候尉间,在處理二元關(guān)系的時候,無論是波蘭式還是逆波蘭式都沒有中綴表達式好理解哲嘲。就比如我們的四則運算,只不過是把加減乘除當(dāng)作了特殊的運算法古掏。
也就是只能處理二元關(guān)系的運算符(這里的是減號而不是負號--一元運算符)侦啸。</p>
<p>除此之外呢,比如函數(shù)f(x . y)光涂,這個樣子寫是表示函數(shù)f中可以有多個參數(shù)。也就是C語言中的f(int... a)可變參數(shù)钝计。</p>
<p>如果我們把函數(shù)f當(dāng)作是一個運算符齐佳,其實它可以是運算符或者是它就是運算符,因為它處理了參數(shù)炼吴。函數(shù)就是一個采用前綴的表達方法。</p>
<p>因為如果你不用前綴你怎么寫出表達式呢硅蹦?比如要定義x,y涮瞻,z這三個參數(shù)的和的函數(shù)假褪,sum(x, y, z),如果用中綴你如何寫出表達式呢嗜价?
(x sum y) sum z 這個樣子嗎幕庐?這個樣子好像也图矣伲坑爹的。也就是說前綴可以支持任意多的參數(shù)冤寿,而中綴只能支持兩個青伤。因為到了多元關(guān)系之后督怜,中綴幾乎不存在
這樣的表示方法狠角,根本沒有可比較的對象。</p>
<p>所以當(dāng)處理非二元關(guān)系的時候姨蟋,前綴表達式還是有一些優(yōu)越的立帖。另一點,如果這個operator的名字比較長晓勇,放在前面會好看一些。(竊喜</p>
<p>當(dāng)然使用前綴表達式可以與函數(shù)表示方法相統(tǒng)一绰筛。這個樣子羡玛,就可以使得很多事情變得和諧,統(tǒng)一稼稿。</p>
<p>說了這些讳窟,其實前綴中綴最大的分歧在于二元關(guān)系上,如果二元關(guān)系出現(xiàn)的多丽啡,那就使用中綴表達式,如果多元關(guān)系出現(xiàn)的多那就使用波蘭式改执。</p>