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

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>
            久久精品一区| 国产在线观看精品一区二区三区| 99精品国产在热久久婷婷| 欧美大片免费久久精品三p| 久久婷婷丁香| 欧美第十八页| 亚洲破处大片| aa级大片欧美| 欧美在线你懂的| 久久久久成人精品免费播放动漫| 久久久亚洲一区| 欧美成人乱码一区二区三区| 欧美日韩亚洲高清一区二区| 国产精品免费一区二区三区在线观看| 国产精品嫩草99a| 在线观看91精品国产入口| 91久久精品久久国产性色也91 | 狠狠色伊人亚洲综合网站色| 欧美高清视频一区| 国产手机视频精品| 亚洲欧美福利一区二区| 亚洲精品国产精品国自产在线| 欧美一区二区视频网站| 久久精品一区中文字幕| 久久在线91| 亚洲毛片在线免费观看| 午夜视频一区二区| 欧美国产激情| 国产综合自拍| 亚洲一二三区精品| 你懂的一区二区| 亚洲午夜小视频| 欧美激情亚洲另类| 在线国产精品一区| 午夜精品短视频| 亚洲欧洲日本国产| 久久久久久久精| 国产色婷婷国产综合在线理论片a| 亚洲黄色小视频| 久久一区二区视频| 亚洲欧美美女| 国产精品久久久久久影视| 99国内精品久久| 欧美激情成人在线| 久久久久免费| 国内成人在线| 久久精品二区| 午夜精品视频在线观看一区二区| 欧美日韩国产不卡| 亚洲免费成人| 亚洲人成人一区二区三区| 久久夜色精品国产亚洲aⅴ| 国产午夜精品一区理论片飘花| 亚洲一区区二区| 99国产精品久久久久久久成人热 | 亚洲国产精品v| 久久精品首页| 狠狠干综合网| 久久综合给合| 久久精品人人爽| 狠狠网亚洲精品| 另类激情亚洲| 免费观看成人| 亚洲裸体俱乐部裸体舞表演av| 欧美激情一二三区| 欧美成在线观看| 一区二区欧美激情| 亚洲一区国产精品| 国产在线视频欧美| 欧美成人中文| 欧美日韩精品免费观看视频完整| 亚洲色图制服丝袜| 狠狠久久亚洲欧美| 在线看一区二区| 亚洲第一天堂av| 欧美激情精品久久久久久大尺度| 亚洲精品久久久久中文字幕欢迎你| 亚洲国产另类久久精品| 欧美日韩在线视频首页| 欧美在线视频免费观看| 久久精品五月| 一本一本久久| 午夜视频在线观看一区| 在线观看欧美视频| 亚洲免费av网站| 国产一区二区三区成人欧美日韩在线观看| 久久精品观看| 欧美电影专区| 久久精品av麻豆的观看方式| 麻豆成人综合网| 亚洲视频免费在线观看| 亚洲欧美日韩一区在线| 亚洲国产精品久久人人爱蜜臀| 亚洲免费观看高清完整版在线观看| 国产精品欧美日韩一区二区| 欧美成人国产一区二区| 国产精品家教| 欧美激情一区二区三区四区| 国产精品中文字幕欧美| 亚洲黄色在线看| 国产一区二区三区黄| 亚洲日本成人在线观看| 韩国女主播一区二区三区| 99精品视频免费| 在线观看日韩av先锋影音电影院| 亚洲少妇自拍| 一本色道久久综合狠狠躁篇的优点 | 国产乱码精品一区二区三区av| 免费成人av在线看| 国产精品家庭影院| 欧美激情一二三区| 国产主播一区二区三区四区| 一本大道av伊人久久综合| 亚洲电影专区| 欧美一区免费| 性欧美1819性猛交| 欧美日韩一区二区三区在线 | ●精品国产综合乱码久久久久| 一本色道久久综合亚洲精品不卡| 精品999在线观看| 亚洲综合色视频| 亚洲视频中文| 欧美激情影音先锋| 欧美国产视频一区二区| 国内精品福利| 欧美在线视频免费观看| 午夜精品久久久久久久久久久| 99精品国产在热久久| 久久精品国产2020观看福利| 欧美日韩和欧美的一区二区| 欧美刺激午夜性久久久久久久| 国产日韩欧美中文在线播放| 亚洲图片欧美午夜| 亚洲一区二区在线播放| 欧美日韩国产免费观看| 亚洲日本va午夜在线电影| 最新国产乱人伦偷精品免费网站 | 亚洲成人在线观看视频| 久久久久久久久伊人| 久久久久久久97| 精品99一区二区三区| 久久野战av| 亚洲经典一区| 中文欧美字幕免费| 国产九区一区在线| 亚洲影院污污.| 久久久久国色av免费看影院| 国内精品免费在线观看| 久久漫画官网| 亚洲精品欧洲精品| 亚洲综合国产激情另类一区| 国产精品制服诱惑| 久久久福利视频| 欧美成人综合在线| 99re这里只有精品6| 国产精品国产精品| 久久国产精品第一页| 欧美电影免费观看高清完整版| 亚洲免费观看高清完整版在线观看| 欧美日韩成人一区二区| 亚洲在线成人| 欧美a级理论片| 亚洲在线第一页| 激情久久久久久久| 欧美日韩在线播放三区| 欧美影视一区| 91久久线看在观草草青青| 亚洲欧美另类在线| 1000部精品久久久久久久久| 欧美视频免费在线| 久久天天躁夜夜躁狠狠躁2022| 亚洲精品一区二区三区四区高清| 欧美一区二区三区在线观看视频 | 每日更新成人在线视频| 日韩亚洲一区在线播放| 国产亚洲aⅴaaaaaa毛片| 欧美华人在线视频| 午夜在线一区二区| 亚洲精品久久久一区二区三区| 欧美一区免费| 夜夜嗨av色一区二区不卡| 国产视频丨精品|在线观看| 欧美精品久久久久久久久久| 欧美一级二级三级蜜桃| 亚洲另类一区二区| 欧美成人免费视频| 欧美一区二区精品| 一区二区三区精密机械公司 | 国产精品国产三级国产普通话蜜臀 | 久久久久成人精品| 99精品国产福利在线观看免费| 久久漫画官网| 欧美一区二区三区四区高清| 一区二区精品在线| 亚洲高清一二三区| 红桃视频一区| 国产女主播在线一区二区| 欧美另类一区| 欧美www视频| 欧美成人精品在线播放|