亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
樓主: send_linux
打印 上一主題 下一主題

《ruby元編程》有獎(jiǎng)試讀中!(獲獎(jiǎng)名單已公布) [復(fù)制鏈接]

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
41 [報(bào)告]
發(fā)表于 2012-02-29 08:59 |只看該作者
回復(fù) 39# OwnWaterloo


    提一點(diǎn),就歷史來(lái)看,ruby(嚴(yán)格意義上的)是perl的后繼,從名字和各種蛛絲馬跡就可以看出來(lái),似乎作者也承認(rèn)了,不過(guò)我找不到引用。ruby最開始的目的是為了寫perl代碼更方便。所以ruby提供了很多的功能,省略括號(hào)是perl的語(yǔ)法,不過(guò)perl有必須的分號(hào)可以很好的解析;block也是模擬perl的“匿名子過(guò)程”(就是如同map $_[1]+$_[2], [1,2,3],[4,5,6]這種,注意第一個(gè)參數(shù)是表達(dá)式,而此表達(dá)式是作為匿名的lambda函數(shù)存在的),ruby身上可以看出大部分的perl的影子,甚至ruby的網(wǎng)絡(luò)庫(kù)就是比照perl的來(lái)實(shí)現(xiàn)的。其他語(yǔ)言對(duì)ruby的影響反而比較少。

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
42 [報(bào)告]
發(fā)表于 2012-02-29 09:19 |只看該作者
回復(fù) 40# lcqtdwj


    lisp復(fù)雜程度一點(diǎn)都不高。我一句話就能解釋明白,所謂“l(fā)isp復(fù)雜程度高”是因?yàn)閘isp太靈活,你想做啥就做啥,而對(duì)于你想做的,有各種各樣已經(jīng)規(guī)定好的實(shí)現(xiàn)(包括if和lambda),而這些東西太多了,你才會(huì)覺(jué)得復(fù)雜。

lisp的本質(zhì),一句話就能說(shuō)明白:程序是以S-exp表示的廣義表,對(duì)程序的求值(運(yùn)算、執(zhí)行),本質(zhì)上是對(duì)廣義表的求值,這是一個(gè)遞歸過(guò)程:對(duì)廣義表的第一個(gè)元素求值,并決定如何對(duì)其他元素進(jìn)行求值。完了。

比如(display (if (< a 1) 'a 'b)),先求值(display ...),首先根據(jù)描述對(duì)display求值:他是個(gè)函數(shù),那么函數(shù)的求值方式是對(duì)其所有后繼子項(xiàng)求值,那么開始對(duì)(if ...)求值,if是個(gè)special-form,他的求值方式是對(duì)第二項(xiàng)進(jìn)行求值,如果是真就對(duì)第三項(xiàng)進(jìn)行求值,否則就對(duì)第四項(xiàng)進(jìn)行求值………………

這個(gè)過(guò)程說(shuō)起來(lái)復(fù)雜,實(shí)際上就是一個(gè)多叉樹的遍歷而已,任何語(yǔ)言都可以很簡(jiǎn)單地做到(所以說(shuō)ruby能簡(jiǎn)單實(shí)現(xiàn)scheme真不是什么很自豪的事情),只是lisp特別靈活,它通過(guò)第一個(gè)元素對(duì)這個(gè)遍歷過(guò)程進(jìn)行了控制。你可以認(rèn)為lisp特別適合于dfs搜索功能,當(dāng)然這就是“l(fā)isp適合人工智能”這種論斷的原因。

那lisp的問(wèn)題在哪兒呢?在于效率。如上所說(shuō),要根據(jù)定義去執(zhí)行l(wèi)isp程序出乎人意料的簡(jiǎn)單,問(wèn)題是性能就不好說(shuō)了。ruby本來(lái)就慢,用這種方式求值lisp沒(méi)什么問(wèn)題,但是如果你是正兒八經(jīng)去考慮高效地執(zhí)行l(wèi)isp程序,你不得不考慮很多問(wèn)題:lisp到字節(jié)碼甚至機(jī)器碼的翻譯(為了jit或者效率)、cons的高效存儲(chǔ)、輕量級(jí)編譯器的實(shí)現(xiàn)、垃圾回收的效率等等等等,這才是lisp的難點(diǎn)所在,為了克服這些難點(diǎn),實(shí)現(xiàn)要么減少了lisp的靈活性(不允許修改+-*/神碼的),要么體積會(huì)很大(以同時(shí)支持靈活性和效率),這才是lisp不容易實(shí)用的原因。

但是你必須承認(rèn),真正做到了這點(diǎn)的lisp效率是ruby的300多倍(參看programming language benchmark game),而做不到這點(diǎn)的lisp(如用ruby實(shí)現(xiàn)的lisp)本質(zhì)上就是個(gè)toy而已。

最后說(shuō)說(shuō)ruby吧。這是我第一門腳本語(yǔ)言。最開始對(duì)它是很有好感的,但是因?yàn)榱私獾剿莗erl的后繼,我就開始學(xué)習(xí)perl,感覺(jué)perl太難學(xué)就轉(zhuǎn)了python,后來(lái)我常用perl(工作中)和python(私下里),就對(duì)ruby生疏了。作為一門perl的后繼語(yǔ)言,ruby無(wú)疑是目標(biāo)明確的——它拉低了編程的門檻(至于這個(gè)目標(biāo)是不是有益去問(wèn)OwnWaterloo吧),然而ruby自身也有很多問(wèn)題,第一個(gè)就是翻譯的問(wèn)題了,第二個(gè)就是效率問(wèn)題。ruby的效率低一方面用的是yacc而不是自行實(shí)現(xiàn)的翻譯器,另一方面它的執(zhí)行方式和樸素的lisp非常像——它也是執(zhí)行語(yǔ)法樹的!而且是以一種寫死的遍歷方式進(jìn)行執(zhí)行,這種方式我看是揚(yáng)短避長(zhǎng)了。它沒(méi)得到lisp的靈活性,反而損失了性能,這是得不償失的。

由此可以看出ruby對(duì)真正元編程的支持了,目前是很弱的,然而應(yīng)該有足夠的潛力達(dá)到很好的支持水平。而這本書里面提到的“元編程”,我覺(jué)得實(shí)在是不能被稱為元編程——這種元編程不是通過(guò)生成代碼來(lái)實(shí)現(xiàn)的,對(duì)效率沒(méi)有任何額外的好處,只是“運(yùn)行時(shí)獲取程序所有信息”而已,最多算是“元執(zhí)行”或者“元計(jì)算”。所謂元編程,即“生成程序的程序”,最初是為了可維護(hù)性(如檢查)和效率(如直接生成復(fù)雜代碼的執(zhí)行結(jié)果),而這些在單趟的ruby模型下是做不到的,除非你用ruby去生成ruby代碼:用ruby寫DSL來(lái)描述需求、DSL產(chǎn)生數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)再產(chǎn)生ruby代碼,再執(zhí)行產(chǎn)生的ruby代碼。如果是這樣那還有點(diǎn)看頭,不過(guò)ruby做到這個(gè)也就平淡無(wú)奇了,看看lua的一個(gè)綁定庫(kù)的DSL吧:

  1. require 'lbind'.export(_ENV)
  2. require 'lbind.types'.export(_ENV)

  3. module 'gd' {
  4.     export = true,
  5.     include "gd.h";
  6.     subfiles {
  7.         --"gdImage.bind.lua";
  8.     };

  9.     object "gdImage" {
  10.         method "new" :cname "gdImageCreate"
  11.             (int "sx", int "sy") :rets(selfType:ptr());
  12.         method "newTrueColor" :cname "gdImageCreateTrueColor"
  13.             (int "sx", int "sy") :rets(selfType:ptr());
  14.         method "delete" () :alias "close" :cname "gdImageDestroy";
  15.         method "color_allocate" :cname "gdImageColorAllocate"
  16.             (int "r", int "g", int "b");
  17.         method "line" :cname "gdImageLine"
  18.             (int "x1", int "y1", int "x2", int "y2", int "color");

  19.         include "errno.h";
  20.         include "string.h";
  21.         method "toPNG" (char:const():ptr "name") :body [[
  22.             FILE *pngout = fopen(name, "wb");
  23.             if (pngout == NULL) {
  24.                 lua_pushnil(L);
  25.                 lua_pushstring(L, strerror(errno));
  26.                 return 2;
  27.             }
  28.             gdImagePng(self, pngout);
  29.             fclose(pngout);
  30.             lua_pushboolean(L, 1);
  31.             return 1;
  32.         ]];
  33.     };
  34. };

復(fù)制代碼
ruby能產(chǎn)生這么緊湊自然的DSL么?

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
43 [報(bào)告]
發(fā)表于 2012-02-29 13:38 |只看該作者
回復(fù) 41# starwing83

松本與Larry的基情貌似聽說(shuō)過(guò)……
但block一開始似乎真的只是loop construct……  稍后說(shuō)……

1. 語(yǔ)法設(shè)計(jì)很難……  一個(gè)地方小贏可以導(dǎo)致其他地方大輸……
2. 我不知道smalltalk是不是這樣,但ruby也許就類似你說(shuō)的那種純粹的OO……
只有消息,木有函數(shù)……  想傳入一個(gè)可調(diào)用的東西必須創(chuàng)建一個(gè)對(duì)象,產(chǎn)生者與使用者約定使用call消息……


關(guān)于block與%_[1]+$_[2]……  我問(wèn)你,后者里面可不可以有return?
如果我告訴你前者不但可以有return,而且return不但可以跳出block,還可以跳出block的調(diào)用者…… 你會(huì)不會(huì)驚掉下巴……

  1. n.times do |i|
  2.   ...
  3.   return
  4. end
復(fù)制代碼
或者

  1. n.times { |i|
  2.   ...
  3.   return
  4. }
復(fù)制代碼
不僅僅是跳出block,還可以跳出times……   所以我說(shuō)block一開始似乎真的只是為了loop……

do |i| ... end, {|i| ... } 我不知道誰(shuí)先誰(shuí)后……

同時(shí),上面說(shuō)了,block是一種語(yǔ)法:
1. 所以compose(f,g)(x)不行…… 因?yàn)楹竺媸菫閎lock預(yù)留的……
2. block是一個(gè)隱式"參數(shù)"……  又隱式…… 咋就這么喜歡隱式……  一旦隱式就丟失了范性好嗎……
3. 不是1st class…… 如果不是傳遞給那個(gè)隱式參數(shù)…… 需要某種東西將其轉(zhuǎn)為1st……
于是就有Proc.new/lambda, 前者return跳出block的調(diào)用者, 后者僅跳出block……  還有個(gè)proc, 在一些版本里是lambda,在后續(xù)版本里是Proc.new……

lambda {...} 在1.9里有一種新語(yǔ)法……

故事沒(méi)完……  proc是將block包裹為一個(gè)1st class value…… 可以傳遞給顯式參數(shù)。
還有一種語(yǔ)法向那個(gè)隱式參數(shù)傳遞……  map(&...)

我還沒(méi)有研究嵌套函數(shù)……  變量作用域等東西……  不知道會(huì)不會(huì)鬧出更多喜劇……



我寧愿相信發(fā)展過(guò)程是這樣……
1. do |i| ... end 為了將循環(huán)解耦合,也就是松本自己提到的loop abstraction
2. {|i| ... } 作為上面的語(yǔ)法糖
3. 需要不止一個(gè)可調(diào)用體了, 于是出現(xiàn)proc與它產(chǎn)生的包裹對(duì)象
4. "借鑒"lisp, 讓lambda變成proc的同義詞……
5. 為了面向?qū)ο蟆?于是出現(xiàn)了 Proc class, 讓Proc.new 完成原始的loop return, 讓lambda完成匿名函數(shù), 將proc從lambda改為Proc.new并廢棄之……
6. 不知道1.9引入lambda的新語(yǔ)法后, 會(huì)不會(huì)再將 lambda給廢棄掉……  因?yàn)椋?這可不是面向?qū)ο蟮臇|西……
7. map(&...) 這個(gè)我也不知道應(yīng)該插入到上面哪個(gè)地方……

你能體會(huì)我看到松本的那個(gè)interview中那段話的心情嗎……  basically, block is ... loop abstraction……

寧愿相信這是因?yàn)樗杀緵](méi)能一次性地發(fā)覺(jué)1st class function是更范化的抽象機(jī)制,配合exception也可以完成 loop return。
這最多只能說(shuō)他笨。

而不是因?yàn)檫@就是松本真實(shí)的意圖……  就是要讓1st class function+exception可以完成的事變得這么復(fù)雜…… 因?yàn)檫@樣才語(yǔ)法"自然", 才user friendly……
我能說(shuō)他是變態(tài)嗎……

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
44 [報(bào)告]
發(fā)表于 2012-02-29 14:04 |只看該作者
回復(fù) 42# starwing83

語(yǔ)言能改變程序員的思想……  學(xué)了lisp后我發(fā)現(xiàn)一種新的改變…… lisp能改變程序員對(duì)語(yǔ)法的態(tài)度……
我現(xiàn)在看到各種紛亂的語(yǔ)法就%@#$@#$……  對(duì)C++11興趣不大也有這個(gè)原因……
我直到現(xiàn)在都沒(méi)去研究haskell的do notation,打算對(duì)monad有更好的理解之后再說(shuō)……
而且haskell社區(qū)也有人認(rèn)為do notation對(duì)理解monad是有害的。因?yàn)樗屆枋?strong>邏輯上是sequential的東西看上去像命令式語(yǔ)言……

lambda {|a,b| a+b} vs ->(a, b){a + b} 語(yǔ)意一點(diǎn)沒(méi)變…… 連typing都不能節(jié)省多少…… 僅僅是因?yàn)樗?strong>看上去好一些……


重度依賴語(yǔ)法的語(yǔ)言會(huì)讓程序員想要更多的語(yǔ)法,為了讓代碼看上去更"natural",卻不能簡(jiǎn)化任何語(yǔ)意……
但要解釋、理解這些natural代碼時(shí),終結(jié)還是得回到語(yǔ)意上去……

語(yǔ)法繁多的代價(jià)前面已經(jīng)指出不少了,只是受重語(yǔ)法語(yǔ)言影響的程序員不會(huì)察覺(jué)、承認(rèn),或者根本不在乎這點(diǎn),甚至引以為豪……

嗯,其實(shí)我想說(shuō),你那段lua的DSL也許根本就不會(huì)被ruby程序員接受…… 因?yàn)檫@些代碼看上去不像一些熟悉的東西……

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
45 [報(bào)告]
發(fā)表于 2012-02-29 14:15 |只看該作者
回復(fù) 44# OwnWaterloo


    那你覺(jué)得有語(yǔ)法好不好呢?反正我看見(jiàn)一堆括號(hào)就頭疼

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
46 [報(bào)告]
發(fā)表于 2012-02-29 14:25 |只看該作者
回復(fù) 45# starwing83

你知道的,我就是因?yàn)閘isp語(yǔ)法怪,才選emacs而非vim的……  被人捧上天了也許有其原因……
于是我得到了……
haskell我也是去找自虐的……

ruby也被人追捧…… 但我還沒(méi)得到……

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
47 [報(bào)告]
發(fā)表于 2012-02-29 14:35 |只看該作者
回復(fù) 42# starwing83

>> 實(shí)現(xiàn)要么減少了lisp的靈活性(不允許修改+-*/神碼的),要么體積會(huì)很大(以同時(shí)支持靈活性和效率),這才是lisp不容易實(shí)用的原因。

no。 需要某種靈活性就必須得承受相應(yīng)的代價(jià),時(shí)間或空間效率。

只要允許修改+,-,那所有語(yǔ)言在這里都會(huì)有效率損失。
只是一些語(yǔ)言不允許。
cl語(yǔ)言允許,但cl實(shí)現(xiàn)可以不允許。 以前給你的那個(gè)add反匯編, 確實(shí)只有4-5條機(jī)器指令, 一些操作調(diào)用棧, 還剩一條addl, 但肯定沒(méi)有call/jmp。
就像其他語(yǔ)言里inline的效率與靈活性一樣, g中的f調(diào)用被inline, f的改變就無(wú)法影響到g, 除非重新編譯g。


同樣,體積大也是實(shí)現(xiàn)的事而不是語(yǔ)言的事。
cl是將編程分為develop與deliver,前者為了開發(fā)方便會(huì)在程序中加入很多很多東西。
有些實(shí)現(xiàn)不關(guān)注體積(比如sbcl),其他也許默認(rèn)是插入了全功能的開發(fā)用的信息,你得找到將這些信息去掉的編譯參數(shù)。
你想要的是默認(rèn)行為是讓開發(fā)功能盡可能少,讓這些功能顯示傳入?  目前沒(méi)找到這樣的實(shí)現(xiàn), 不能證明這樣的實(shí)現(xiàn)沒(méi)有對(duì)不對(duì)?


BTW: lua里,你以前說(shuō) a+b 就會(huì)翻譯為number +? 編譯器怎么知道a,b沒(méi)有元表?

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
48 [報(bào)告]
發(fā)表于 2012-02-29 17:08 |只看該作者
回復(fù) 47# OwnWaterloo


    lua如果發(fā)現(xiàn)+-×/的兩個(gè)操作數(shù)如果全都是number,則執(zhí)行默認(rèn)操作,不管有沒(méi)有__add神馬的。也就是說(shuō),數(shù)字的+-×/不允許替換掉。

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
49 [報(bào)告]
發(fā)表于 2012-02-29 17:09 |只看該作者
回復(fù) 47# OwnWaterloo


    我就有個(gè)小問(wèn)題:luaJIT的效率已經(jīng)堪比大多數(shù)的lisp實(shí)現(xiàn)了,而且相差不大,但是luaJIT的大小是500K,你找個(gè)跟luaJIT一樣大一樣快的實(shí)現(xiàn)?我就是在說(shuō)lisp這種概念阻止了很好的優(yōu)化。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
50 [報(bào)告]
發(fā)表于 2012-02-29 19:16 |只看該作者
回復(fù) 48# starwing83

a+b, 編譯 —— 而且你說(shuō)是一趟編譯,一邊parse一邊就compile了 —— 這行代碼時(shí),該產(chǎn)生怎樣的代碼?
怎么知道a,b一定是number?

或者這么說(shuō): function(a,b) return a+b end,編譯后是否僅支持傳入number? 是否支持傳入帶元表的對(duì)象?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP