青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

huaxiazhihuo

 

lisp的括號

       lisp(當然也包括scheme)的元編程(也即是宏)威力非常強悍,相比之下,c++的元編程(template+預處理)簡直就是弱爆了,被人家甩幾條街都不止。 當然,template的類型推導很厲害,也能生成很多簽名類似的class和function,比其他語言的泛型強多了,但是,template再厲害,也不能生成名字相似的function還有變量。 預處理可以生成名字相似的變量和函數。但是,預處理的圖靈完備是沒有類型這個概念,只有字符串,整數那個東西還要靠字符串的并接來實現。所以,預處理沒法得到template里面的類型信息。新版本的c++中有了decltype之后,宏可以通過某種方式以統一的形式來利用類型信息。但是,在代碼生成方面,預處理還是很弱智,主要的問題在于宏對于自己要生成的代碼結構很難構建語法樹,也不能利用編譯階段的功能,比如調用編譯階段的函數。 想說的是,很難以在代碼中只用宏來寫一個稍微復雜的程序,即使做得到,也要吐好幾口老血,還煞難調試。
       lisp就不一樣了,宏和語言融為一體,以至于代碼即是數據。只要你愿意,完全可以在lisp中只用宏寫代碼,只要愿意,分鐘鐘可以用lisp寫一個dsl,比如loop就是一個專門處理循環的dsl。甚至,用lisp宏還可以做靜態類型推導的事情,也非難事。因此,用lisp宏搞基于對象 (adt)也都有可能,從而優雅的使用.操作符。比如(+ obj1.item obj2.item) (obj.fun 2 "hello")。你說,lisp宏連.操作符都可以做到,就問你怕不怕。
       但是,宏再厲害,也不能隨意地搞底層操作內存。恰好與c++相反,c++搞底層隨意操作內存太容易了,但是元編程的能力就遠遠不如lisp了。
       emacs是最好玩的ide,注意不是最強大,猿猴隨時可以寫代碼增加改變emacs的功能,馬上見效,不需要任何配置,不需要重啟。因此,elisp也是最好玩的語言了,因為最好玩的ide的腳本語言就是它了,呵呵,主要原因還是elisp是lisp的方言,可以承擔lisp的很多構思,當然,完全繼承是不行的,不過,已經足夠做很多很多的事情了。
       不過,本期的話題是lisp的括號,為什么lisp會有那么多的括號,鋪天蓋地,很容易,就一堆一堆的括號擾人耳目,以至于lisp代碼不好手寫,只能忽視括號,依靠縮進。括號表示嵌套,相必之下,c系語言的嵌套就沒那么恐怖了。一個程序,頂破天,最深層都不會超過十層,連同名字空間,類聲明,函數,再到內部的for,if,大括號,中括號,小括號。
       中綴表達式,這個眾所周知了,試比較,1+2-3*4/obj.width,沒有任何括號,依靠運算符優先級表示層次關系。并且,猿猴也習慣并本能的解析中綴表達式了,因此,代碼看起來一目了然。lisp就很可憐了, (- (+ 1 2) (/ (* 3 4) (obj-width obj))),這里面多了多少括號,在轉換成這行簡單算式的時候,還是在emacs下面寫出來的。關鍵是,雖然前綴表達式沒有任何運算級別上的歧義,但是,人眼還是比較習慣中綴表達式了。君不見haskell的括號更少了,其對中綴表達式和符號的運用更深入。關鍵是,中綴表達式很容易手寫啊。易寫,自然也表示易讀。C#的linq的深受歡迎也因為其好讀,無須在大腦里面建立什么堆棧,linq表達式就是上一個處理的結果通過.操作符傳遞到下一個運算中,非常順暢,不必返回前面去看看當前的操作數的運算是什么,因為運算符就在眼前了。中綴表達式.操作符,更是滅掉括號的大殺器,比如,obj.child1.child2.value,這里用lisp來搞,4個括號避免不了的。
       試試將java萬物皆是對象推向極致,然后沒有中綴表達式,1.plus(2).minus(3.mult(4).obj.width)),比lisp要好一些,但也有很多括號了,并且,在minus這里,其括號嵌套也只是減少了一層而已。當表達式復雜起來的時候,這種缺點也要相應的放大。
       變量的就地定義,好像c系的變量要用到的時候才定義這種語法很稀疏平常,沒什么了不起的。但是,到了lisp下面時,就知道這是多么貼近人心的便利啊。每次用到新變量,都要引入let表達式,又或許跑到前面的let語句中寫變量,要么就打斷當前的代碼編寫,要么就引入新的一層嵌套關系。一個狀態復雜的函數,很容易就出現好多個let語法塊。而c系的變量就地定義,顯得那么淡定。
       return,continue,break等語句就可以把后面的語句拉起來一個層次,假設沒有這些關鍵字,要用if else語句,那么,這些return,continue,break后面的語句都表示要被包含在一個else的大括號中。
       lisp里面的特有語句,with-*等宏,都要求嵌套。幾個with-*宏串起來,幾個括號嵌套關系就跑不了啦。而c++通過析構函數就多么地讓人愛不釋手了,java也可以別扭的用finally來應付了。
       控制結構的并行。像是if,for,while或者是class還有函數定義等語句,其后面的代碼塊是并列在關鍵字的后面,這樣就少了一層嵌套。不過這個作用并沒有那么巨大。主要還是前面4點。
       這樣,就可以模擬其他語言的特性來滅掉lisp的括號。當然是要到宏了,loop就是一種嘗試。但是,下面將走得更遠。其實,就是設計一套新的語法了。
       假設這個宏的名字是$block,那么后面的文章就可以這樣做。
       1 加入一個$操作符。$表示后面的代碼都被收入進去。比如,1+2-3*4/4,就可以寫成($block (-) $ (+ 1 2) (/) $ (* 3 4) 4)。于是,with-*等宏的嵌套就可以用$來代替了。雖然,$的作用好像有些欠缺,功能不完備,但是,只要考慮到括號都是在最外層體現的,那么,$就顯得很有作用了。
       2 加入let的操作符,表示就地引入變量,其實也即是將變量名字加入上層的(let)的變量列表中,然后在這里插入一條(setq var vlaue)的語句。
       3 加入if,elif,else,for,switch等語句,于是后面的代碼塊就與之平行了,并且準備一個(let)的語句,用于給with語句添加變量。可以借鑒loop宏的方式
       4 return,break,continue等相應的實現。
       5 支持.操作符,所有關于.的操作,都轉換成相應的函數操作,好像以前的cfront在對于成員函數的支持那樣子。這里就要有靜態類型推導了,可以通過with語句中加入變量的類型說明,給函數添加返回類型的標簽。有了這些信息,就可以找到obj相應的成員函數的名字,就可以生成對應的函數調用的form了,這個做起來有點難度。
       ......
       以上,除了第5點,其他都可以借鑒loop的代碼來實現。$block里面的代碼,便于手寫,括號也沒有那么面目可憎了。

posted on 2016-05-20 11:17 華夏之火 閱讀(3000) 評論(0)  編輯 收藏 引用 所屬分類: emacs elisp


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

統計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情在线观看| 日韩视频免费| 狠狠久久亚洲欧美专区| 欧美日韩高清免费| 久久一区欧美| 久久久福利视频| 一区二区三区色| 亚洲全黄一级网站| 亚洲国产黄色片| 欧美激情第三页| 欧美成人按摩| 亚洲高清资源| 亚洲国产成人精品久久| 亚洲高清在线观看| 亚洲国产影院| avtt综合网| 亚洲性感美女99在线| 亚洲一区在线播放| 久久aⅴ国产欧美74aaa| 亚洲精品视频在线观看网站| 日韩视频在线一区二区三区| 一区二区三区www| 亚洲宅男天堂在线观看无病毒| 亚洲在线中文字幕| 一区二区久久| 欧美成人精品福利| 亚洲人成小说网站色在线| 亚洲精品国产精品国自产在线 | 久久精品一本| 久热国产精品| 久久精品在线视频| 欧美日本国产精品| 国产亚洲一区精品| 亚洲精品1234| 亚洲欧美影音先锋| 免费日韩一区二区| 亚洲视频在线观看三级| 久久久免费精品视频| 欧美精品乱人伦久久久久久| 国产精品日韩在线| 国产精品久久久久久户外露出| 国产在线欧美日韩| 久久综合九色综合欧美狠狠| 亚洲欧美日韩电影| 免费观看日韩| 一区二区精品| 狂野欧美激情性xxxx| 欧美成人精品h版在线观看| 国产精品s色| 亚洲黄色在线视频| 久久精品官网| 亚洲精品日韩在线| 久久久精品视频成人| 国产精品扒开腿做爽爽爽视频| 精品91在线| 在线看国产一区| 性色av一区二区三区在线观看 | 欧美在线观看视频在线| 亚洲成色999久久网站| 亚洲视频一二| 欧美精品久久久久久久免费观看| 国产免费观看久久| 一区二区三区日韩精品| 午夜精品久久久久| 亚洲乱码国产乱码精品精可以看 | 国产精品一区二区男女羞羞无遮挡| 樱桃成人精品视频在线播放| 亚洲欧美日韩另类| 亚洲久色影视| 欧美精选一区| 亚洲每日在线| 欧美成人激情视频免费观看| 欧美一区二区视频免费观看| 欧美午夜宅男影院在线观看| 亚洲美女电影在线| 亚洲第一黄色| 午夜一级久久| 麻豆精品一区二区综合av| 国产亚洲午夜高清国产拍精品| 亚洲天堂成人在线观看| 亚洲国产小视频| 久久综合给合| 亚洲国产第一| 欧美激情中文不卡| 蜜桃视频一区| 亚洲大片在线观看| 欧美成年人视频网站| 亚洲视频在线二区| 国产精品自拍三区| 久久福利视频导航| 香蕉久久精品日日躁夜夜躁| 国产精品视频网址| 久久电影一区| 久久一区二区三区国产精品 | 亚洲破处大片| 亚洲国产日韩在线| 欧美精品亚洲二区| 一本色道精品久久一区二区三区 | 亚洲在线一区| 午夜一区不卡| 亚洲高清在线观看| 亚洲日韩欧美视频一区| 欧美日韩国产在线播放网站| 亚洲午夜一区二区三区| 亚洲男人的天堂在线| 国产在线国偷精品产拍免费yy| 玖玖玖免费嫩草在线影院一区| 亚洲女优在线| 亚洲国产成人高清精品| 91久久国产综合久久蜜月精品| 亚洲精品在线观| 亚洲国产精品久久久久秋霞影院| 牛牛国产精品| 国产精品三级视频| 亚洲国产成人午夜在线一区| 国产日韩精品一区| 亚洲精品孕妇| 亚洲国产一区二区三区在线播 | 国产日韩欧美在线视频观看| 欧美激情第3页| 国模私拍视频一区| 亚洲一区国产一区| 亚洲视频香蕉人妖| 欧美伦理91| 亚洲国产精品成人综合| ●精品国产综合乱码久久久久| 午夜亚洲性色视频| 午夜伦欧美伦电影理论片| 欧美日韩第一区日日骚| 亚洲国产成人91精品| 亚洲电影免费观看高清| 久久久精彩视频| 老妇喷水一区二区三区| 狠狠久久五月精品中文字幕| 欧美亚洲在线播放| 久久久久国色av免费看影院 | 亚洲欧美日韩在线综合| 亚洲自拍啪啪| 国产精品乱码一区二区三区| 一区二区三区国产在线观看| 在线综合视频| 欧美视频日韩视频在线观看| 亚洲精品在线视频观看| 一区二区三区国产精华| 欧美日韩xxxxx| 亚洲视频在线观看免费| 欧美日韩一区二区三区视频| 亚洲精一区二区三区| 一区二区三区欧美成人| 欧美日韩在线观看一区二区三区| 99精品国产99久久久久久福利| 亚洲视频一区在线| 国产美女精品视频免费观看| 性伦欧美刺激片在线观看| 久久免费视频在线| 久久免费国产精品| 国产一区二区剧情av在线| 久久久精品性| 亚洲欧洲日本专区| 亚洲一级二级| 国产婷婷色一区二区三区四区| 久久精品最新地址| 亚洲国产精品一区二区尤物区| 日韩一区二区精品在线观看| 国产精品magnet| 久久成人综合视频| 亚洲激情在线视频| 亚洲欧美日韩一区二区在线| 国产一区二区三区在线观看精品 | 亚洲欧美国产一区二区三区| 久久久亚洲高清| 亚洲美女色禁图| 国产亚洲精品7777| 欧美精品在线观看91| 欧美一区二区三区在线免费观看 | 亚洲美女福利视频网站| 久久激情网站| 亚洲免费成人| 国内精品久久久久久久影视蜜臀| 欧美黑人国产人伦爽爽爽| 午夜久久久久久久久久一区二区| 亚洲高清不卡| 久久久久亚洲综合| 亚洲午夜精品| 亚洲国产精品va在线看黑人| 国产精品久久久久久久午夜 | 国产精品久久福利| 另类激情亚洲| 香蕉久久夜色| 在线亚洲观看| 狂野欧美激情性xxxx| 亚洲一区二区三区四区五区黄 | 久久国产手机看片| 在线视频亚洲| 亚洲乱码国产乱码精品精| 国产一区视频网站| 国产精品www| 欧美日韩一区二区在线视频 | 亚洲一区二区网站| 亚洲美女毛片|