??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩精品久久久久,午夜人妻久久久久久久久,人妻精品久久久久中文字幕69 http://www.shnenglu.com/huaxiazhihuo/category/20583.htmlzh-cnTue, 10 May 2016 23:08:37 GMTTue, 10 May 2016 23:08:37 GMT60消息发送杂?/title><link>http://www.shnenglu.com/huaxiazhihuo/archive/2016/05/10/213491.html</link><dc:creator>华夏之火</dc:creator><author>华夏之火</author><pubDate>Tue, 10 May 2016 14:40:00 GMT</pubDate><guid>http://www.shnenglu.com/huaxiazhihuo/archive/2016/05/10/213491.html</guid><wfw:comment>http://www.shnenglu.com/huaxiazhihuo/comments/213491.html</wfw:comment><comments>http://www.shnenglu.com/huaxiazhihuo/archive/2016/05/10/213491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/huaxiazhihuo/comments/commentRss/213491.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huaxiazhihuo/services/trackbacks/213491.html</trackback:ping><description><![CDATA[<div>      最q在看MFC的代码,虽然q破玩意Q老朽已经很熟(zhn)了(jin)得不能再熟?zhn)了(jin),但是q些破代码自由其独有的吸引力Q不说别的,单单理解h非常容易,比之什么boost代码Ҏ(gu)看多?jin),单步调试什么的Q都非常方便Q堆栈上一查看Q层ơ调用一目了(jin)然。一ơ又一ơ地虐这些曾l虐q老朽的代码,也是人生快事一件。^?j)而论Qmfc的代码还是写得挺不错的,中规中矩Q再加上q去?ji)十q代之初Q?6位的windowspȝQ那个时候的面向对象的c++的风靡一Ӟ完全采用标准c++Q能做成q样Q实属难能可贵,也在情理之内。ƈ且,后面压上com之后Qmfc也不崩盘Q采用内嵌类实现的com的方式,也很有意思。然后,从mfc中也能学Cwindows gui的用方式还有各U其他杂七杂八东西,虽然win32已经没落。但是里面的技术还是挺吸引人,可以消遣也不错。当?dng)对于ChQmfc不徏议再?l)C(jin)Qmfc真是没饭吃的意思。你xQ一个gui框架Q没有template可用的情况下Q而逆天c++11的lambda作ؓ(f)匿名functorQ更加不必提?jin),只有虚函数和l承可用Q也没有exceptionQ能搞成mfcq副摸样Q的而且是_֓。其实,后来的巨也有救赎,看看人家用template做出来的专ؓ(f)com打造的atl又是什么样子呢Q然后徏构在atl的windows thunk基础上开发的wtl又是怎样的小巧玲珑。巨在template上的使用q是很厉害的Qatltemplate和多l承用的真是漂亮。h家几十年前就template和多l承用得如此出神入化Q反观国内,一大批C with class又或者狗_一再叫嚣template滚出c++Q多l承太复杂了(jin)Q运符重蝲不透明Q心(j)担,隐式cd转换问题太多Qvirtual是罪恶之源万恶之首,构造函数析构函数背着马猿做了(jin)太多事情Qexception对代码冲d大,打断代码正常行Q时时刻刻都好像隐藏着不定时炸式V依本看来QC++中一大批能够显著减少重复代码Q带来类型安全的拔高抽象层次的好东西Q对于这些C语言卫道士而言Q都是؜׃物。其实,c语言是一块废_(d)抽象层次太低Q可以做文章的地方太了(jin)?br />      ׃构造函数和cd转换operatorZQ来看看怎么用于C的char *itoa(int value,  char *str,  int radix)?br />      itoa的参C所以还需要str入参Q那是因为C语言中缺乏返回数l的语言元素Q所以调用者要提供一个字W数l作为缓冲用于存攄果,但是q个多出来str参数真是没必要啊Q因a能力的欠~,所以只好把q个负担压到猿猴w上。也有些itoa的实现没有这个篏赘str的入参,而是内部static的字W数l,用于存放l果q返回给上层。这个版本就只有两个入参?jin),但是也太不安全?jin)Q别提多U程?jin)。假如,有一个函数fn(char* str1, char* str2)Q然后,q样调用fn(itoa(num1),itoa(num2))Q画面太了(jin)。另外,那个有多余str参数版本的itoa也好不到哪里去,要劳?j)费准备两块字W数l,然后q要保证参数传递的时候不要一栗反正C语言的粉丝整天很喜欢写这些重复代码,q且其名曰掌控一切细节的快感?br />L(fng)构造函数和cd转换operator怎么解决。太easy?jin)?br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> ToString<br />{<br />    </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> text[</span><span style="color: #000000; ">28</span><span style="color: #000000; ">];<br />    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> length;<br /><br />    ToString(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> n)<br />    {<br />        </span><span style="color: #008000; ">//</span><span style="color: #008000; ">转换字符Ԍl果存放于text?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    }<br /><br />    </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">()<br />    {<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> text;<br />    }<br />};</span></div><div>      q且Q这里的ToStringq可以安全的用之于printf里面呢,因ؓ(f)它本w就是字W串的化w。ؓ(f)什么是ToStringQ因为它不仅仅要它ToString intQ还有doubleQboolQcharQ?#8230;…<br />      不好意思,扯远?jin),只是惌Q框架或者函数库的表现能力也要取决于语言本n的表达能力。就好像C#可以做出linq那样爽快的框Ӟjava再怎么拼命也捣鼓不出来一个一半好用的linqQC++也不行,但是C++可以捣鼓cM于haskell中的mapQfilterQfold{,  q结合linq的后~表达方式。就好比下面q样<br />      vector<int> nums = {...}<br />      Range(nums).Map(_1 * _1).Filter(_1 % 2).CopyTo(dest); // 用了(jin)boost中的lambda表达法,因ؓ(f)的确很简z,没法控制。对于复杂情况,当然要用C++11原生的lambda<br />      勉勉强强差可满吧。如果C++的lambda参数可以自动推导好?jin),不过也没什么,主要是ide下用得爽。用泛型lambda也能就?br />      所以,回过头来Q再看看mfcQ没饭吃Q,可以了(jin)解其各种隐痛?jin)。真的,?0q代的眼光来看,mfc真是做到极致?jin)。mfc不可能走win32下窗口函数C语言那样的消息发送消息反应的正\Q邪路)(j)吧。窗口函数这一套,?0q代面向对象盛行的时代,l对不能被忍受,只是C(jin)前几q_(d)才被发现其h(hun)值原来不Ԍq是解耦合砍承树(wi)的好手法Q老朽在前几年也跟风吹捧窗口函数的那一套。^?j)而论Qsmalltalk的这一套消息发送的动态语aQ确实是很强有力的抽象手D,我不目标对象能否反应该消息Q闭着眼睛可以给你发送消息,你能反应反应,不能反应拉倒,或者调用缺省的反应方式Q就好像DefWindowProcQ职责链模式Q)(j)Q又或者是抛出异常Q怎么做都可以。一下子p开?jin)调用者和目标对象的类型耦合关系。面向对象中Q消息发送和消息反应才是核心(j)Q什么封装承多态,那是另一套抽象方式,虽然坊间说这也是面向对象的基本要素,但是不是Q当?dng)q或怹只是个h观点?br />      或许Q从某种意义上讲QC++/java/C#一cȝ成员函数调用形式Q其实也消息发送吧。比如,str.length()Q就是给对象str发送length的消息,然后str收到l(f)ength消息Q作出反应,执行操作Q返回里面字W串的长度。靠Q这明明是直接的函数调用,搞什么消息发送的说辞来强辩,颠倒是非黑白,指鹿为马。可不是吗?~译器知道str是字W串cdQ知道length成员函数Q马上就生成?jin)高效的函数调用方式。在q里Q没有Q何动态多态的可能Q发生就发生?jin),一l调用,动作立马p动,没有M商量的余地。耦合Q这里出现强耦合Q调用者和strl在一块了(jin)Q假如以后出现更高效率更有弹性的string的代替品?jin),可是没法用在q里?jin),因?f)q里str.length()的绑定很紧很紧?br />      人家消息发送就不一样了(jin)Q动态的Q可以动态替换对象,替换Ҏ(gu)Q弹性뀂ƈ且,消息发送的模式下,对象收到消息Q要判断消息Q解析消息,扑ֈ消息的执行函敎ͼ最后才l于执行d。这么多间接层,每一层都可以做很多很多文章。比如,在消息到辑֯象之前做文章Q就可以搞消息队列,把消息和参数暂存hQ这个时候,什么actor模式大攑ּ彩,至于undoQredoQ更加是菜一。然后呢Q再l对象安装消息解析器Q把消息和消息参数{换成其他cd消息。比如原本对象不能反应这条消息,但是Ҏ(gu)息参数稍加修饎ͼ然后在发送给对象Q这不就是适配器模式。MQ可操作可挖掘的I间太大?jin),q远不止23条?br />      但是Q封装承多态就一无是处了(jin)吗?不是的,最L(fng)一点,~译期间可以报错。因为的有很多时候,我们明明q道对象的cdQ明明就知道对象不可能是其他cdQ比如字W串Q比如复敎ͼ比如数组q些玩意Q无论如何,它们都不需要动态消息的能力。我们就知道手上的对象就是字W串是复数Q不可能是别的,q且Q我们就是要明确地调用length函数。我们就是要~译器帮忙检查这里潜在的语法cd错误Q比如对复数对象调用length函数Q编译器马上׃高兴?jin)。ƈ且,一切都是确定的Q所以编译器也能生成高效的代码,高效的不能再高效?jin)。对此,消息发送的面向对象做不到?jin),不管是什么对象,intQstringQcomplexU种Q都来个消息发送。这样一来,?rn)态类型检查和高效的代码,木有了(jin)?br />考察一下,面向对象有等U之分,一步一步,有进化的阶梯。每q化一ơ,多?jin)一层间接,cd耦合降低,p一步超编译器的限Ӟ当然Q也意味着~译器帮忙检查类型错误生成高效代码就׃(jin)一分。事情往往是Q有所得必有所失。少x多,多即是少。因此,可推得少x,多即是多。少始终是少Q多始终是多?br />      一切,q是要从C语言说vQC语言中,没有classQ没有函数重载。函数名是什么,最后就是什么。在q种条g下,代码多了(jin)Q每个新的函数名字要考究半天Q一不小?j),要么函数名字׃?x)很长Q要么函数名字短?jin)要冲突或者不好理解。但是好处是Q最后生成目标代码时Q什么函数名字就是什么名字,所见即所得,没有异常Q不?x)捣|于是其他各种语言都可以高高兴兴开开?j)?j)调用。猿猴观码,也很清晰。C++也是在这里赚?jin)第一桉。其实,q么苛刻的条件下Q最考究猿猴的代码架构能力,架构E微不好Q最后都势必提早崩掉Q前期就可以qo(h)很多垃圾架构?br />      然后是C with class?jin),开始在函数名字上面做文章了(jin)。同一个函数名字依对象cdQ开始拥有静(rn)态多态能力了(jin)。比如,str.length()Q这是对字符串求长度。数l的变量Qnums.length()Q对数组求长度。同一个length的名字,用在不同的对象上Q就有不同的意义。这如何做到呢,最初,cfrontQ第一版C++~译器)(j)的处理方式是Q可以说是语法糖Q就是在名字和调用Ş式上做文章,比如Qstr.length()Q变成,string_length(&str)Qarray_length(&nums)。别看q点把戏语法糖Q这真是有力的抽象手法。不说别的,p起名字吧Q可以统一length?jin),无须?gu)量string_lengthQlist_length?jin)。然后,对象l一调用方式Qstr.length()Qlist.length()Q函数确定这U吃力不讨好的事情就交给~译器去做好啦,解放部分脑细?yu)。这Q的很好,但是Q全局函数是开攑ּ的,而对象的成员函数是封闭的Q一旦class定义完毕Q成员函数的数量也就定死?jin)。猿猴最讲究东西的可扩展性,不管成员函数多么方便多么抽象有力Q就扩展性而言Q就差了(jin)一大截Q其他优劉K弥补不了(jin)。语义上看,扩展成员函数的语法完全与原生的一P增加一个简单的语法形式来扩充,但是多年下来Q标准委员会(x)都不务正业,哎。显?dng)~译器的cd(g)查能力和生成的代码性能Q没有Q何减,但是Q猿猴看代码Q不能再所见所得了(jin)Q必L据对象类型,才能定最l的目标函数。就q么点小改进Q当时C++马上展C其惊h的吸引力。假如,C++只能留在q一层,怿C天ؓ(f)止,可以吸引到更多的c_。可是,C++开始叛变?br />      C++的函数重载,q有操作W重载,外加隐式cd转换和隐式构造函敎ͼq有constQvolatile修饰Q当?dng)代码可以写得更加z,~译器可以做的事情也更多啦,但是函数的调用再也不明确?jin)。部分专注于底层的猿猴的弱小的抽象能力把控不住了(jin)Q不h在这里玩不动?jin)。此外,命名修饰把最l函数名字搞得ؕ七八p,二进制的通用性也要开始废?jin)。导致C++的dll不能像C那样到处通吃。像是狗语言q止函数重载这个功能。大家好像很非难C++的操作符重蝲Q但是haskellq能自定义新的操作符呢。虽然在q里Q编译器q能生成高效代码Q但是,各种奇奇怪怪类型{换的规则Q编译器也偶?dng)表现出奇,甚至匪夷所思,虽然一切都在情理之内?br />      其实Q不考虑什么动态能力,单单是这里的?rn)多态,Z对象Q俗UADTQ的抽象模式Q就可以应付70%以上的代码了(jin)。想想以前没有静(rn)多态的C日子是怎么q的?br />      此时Q开始兵分两路,C++一斚w是动多态发展,表现为承,多承,虚承,虚函敎ͼU虚函数QrttiQ废物,半残?Q到此ؓ(f)止了(jin)Q止步不前;另一斚w是l加强静(rn)多态,王者,templateQ一直在加强Q模板偏特化Qtemplate templateQvaridiac tempalteQconsexpr, autoQconceptQ?#8230;…Q背负着各种指责在前q,是在前q。C++企图以静(rn)态能力的强?zhn)变态恐怖,不惜榨干?rn)态上的一点点可ؓ(f)I间Q篏ȝ译器Q罔边际效应的来少Q企囑I补其动态上的种U不뀂这也是可行的,毕竟haskell都可以做到。template的话题太庞大?jin),我们a归正传,面向对象?br />      下面是被指责得太多的C++多承,虚函敎ͼRTTIQ脆q虚函数表Q等Q这些说法,也都很有道理Q确是实情,gC++没有反射Q没有垃圑֛Ӟ用上面这些破玩意捣鼓Q硬着头皮做设计做框架Q本来就先天能力严重不Q还要考虑内存理q个大敌Q@环引用可不是吹的Q,更有exception在旁虎视眈眈Q随时给予致命一凅R更要命的是Q多l承Q虚函数Q虚l承Q这些本来就杀敌八百自伤一千,严重Cؕclass的内存布局Q你知道vector里面随随便便插入元素Q对于非pod的元素,不仅仅是Ud内存Q腾出新位置来给新对象安营扎寨,q要一ơ又一ơ地对被Ud的对象执行析构拷贝构造。没有这些奇奇怪怪的内存布局Qvector的实现应该会(x)清爽很多。稍微想惻Iq实在太考究猿猴的设计能力,光度不亚于没有M多态特性的C语言?jin)。可以这么说Q承树(wi)一旦出现虚l承q个怪胎Q整体架构就有大问题Q毫无疑问,iostream也不例外。不q,如果没有那么多的动态要求,好比gui框架的变态需求,严格以接口作合对象Q辅以functionQ也x委托Q又可以应付多v?5%的局面。其实,必须要用到virtual函数的时候,virtual函数hihQ那U感觉非常清爽,很多virtual色变Q大可不必。C#和javaq加上垃圑֛收和反射Q这个比例可以放大很多。在q种层次下,接口最大的问题是,好像成员函敎ͼ是封闭的。一个class定义完毕Q其能支持的interface的数量也定M(jin)Q不能再有Q何修攏Vinterface可以说是一个class的对外的开攑֊能,现实世界中,一U东西的对外功能q不是一开始就定死?jin)的Q其功能也在后来慢慢挖掘。但是,C++/java/C#的接口就不是q样Qclass定义完毕Q就没有M潜力可言?jin)。明明看到某些class的能力可以实现某些接口,甚至函数{֐都一P对不P谁让你当初不实现q个接口。对此,各种动态语a闪亮dQ或mixing或鸭子类型。接口还有另一尬之处Q比如,鸟实C(jin)?x)飞的接口,鸭子企鹅也承?jin)鸟,自然也就l承?jin)?x)飞的接口Q没办法不ѝ面对着一个需要IFlyable参数的函敎ͼ我们利的传一只企鹅进去,然后企鹅再里面始l飞不v来,q企鹅在被要求飞的时候,抛出异常Q也不过自欺Zh。这U?zhn)剧,好像有些h很会(x)装|最后一定会(x)坏事。搞出接口这U破事,是Z(jin)让编译器做类型检查的。又有h_(d)bird应当分ؓ(f)两类Q会(x)飞的和不?x)飞的,q的能解决飞行的尴。但是,有很多鸟具备捉虫虫的能力Q然后又有那么一撮鸟不?x)捉虫只会(x)捉|N又要依据捉虫能力再划分出鸟类。于是鸟cȝl承?wi)越长越高,画面来美。这分明是语言能力的不I把问题交l猿猴了(jin)。请谨记Q接口就是一个强有力的契U,既然实现?jin)一个接口,p明有能力做好相关的事情。再_(d)既然interfaceq么重要Q于是我们再设计class的时候,p然而然把精力放在interfaceq个对外交流媒介的手D之上了(jin)Q而忽视了(jin)class本n的推敌Ӏclass最重要的事情就是全?j)全意做好独立完整最化的事情,其他什么对外交互不要理?x)。一个class如果能够完整的封装一个清晰的概念Q后面不怎么重构Q都可以保留下来。但是,interface?x)分散这U设计。接口的(zhn)剧在于企N多以90分的能力d一癑ֈ的事情,q且q以己可以做得好Q硬上强qԌ|顾自n的极限。往往做了(jin)90%的工作量Q事情恰恰就坏在剩下来的10%上?br />      于是Q狗语言C另一条邪路,鸭子cd。只要classQ不Q是structQ这U独特关键字的品呻I只要某个struct能够完全实现某个interface的所有函敎ͼ默认其实现?jin)这个接口。ƈ且,狗语aq禁止了(jin)l承Q代之以“l合”q个高大上的名词?jin),但是Q细I一下语义和内存布局Q忽略虚函数表指针)(j)Q你妈的Q不是一个没有virtuall承的弱多承吗Q显式的l承消失?jin),隐式的承还存在的,好?jin)Q还不让你画出承树(wi)关系图,高高兴兴对外宣称没有l承?jin),没有l承q不表示l承的问题木有存在。但是,因ؓ(f)狗语a的成员函数方法可以定义在classQ不Qstruct外面Q其扩展性就非常好了(jin)Q对于一个interfaceQ有哪些Ҏ(gu)Q本struct不存在,地l它定义出来Q然后,structp杄实现?jin)该接口Q即使原来的struct不支持该接口Q以后也有办法让它支持,很好很强大。之所以能做到q一点,那是因ؓ(f)狗语a的虚函数表是动态生成的。小?j)的使用接口各种名字Q部分h应该狗语a用v来会(x)相当愉快。可是,你妈Q不同接口的函数名字不能一样啊Q或者说Q同一个函数的名字不能出现在不同接口中。不q,q个问题q不难,不就是不一L(fng)名字吗,c语言中此{大风大猿猴谁没有见识q。对于狗语言Q不惛_太多评断Q只是,其扩展性确实不错,非R入式的成员函数和非R入式的接口,理应能更好地应付接口实现q种多态方式,只是Q编译器在上面所做的cdU束惛_?x)不如后者,重构什么的Q想必不?x)很方便。自׃M(jin)Q约束自然也下来?jin)。听h挺美Q但是内里也有些地方要推Ԍ反正老朽不喜Ƣ,以后也不大会(x)用上Q当?dng)lmoney自然?x)用Q给money不搞c++都没问题。老朽q是比较喜欢虚函数的接口Q更何况c++通过奇技淫y也能非R入式的给classd接口。在?rn)态语a中搞q种鸭子cd的动态语a接口Q显得有点不伦不cR?br />      然后是com接口的面向对象,完全舍去~译器对接口cd的约束,自然能换来更大的自由。由于com的语a通用性目标,所以搞得有点复杂,但是com背后的理念也挺纯z。老朽猜测com好似是要在静(rn)态语a上搭建出一个类g动态语a的运行^収ͼ外加语言通用性。其契约很明,操作对象前时Q必d查询到对象支持的接口Q进而调用接口的函数。这里有意思的地方在于面对着一个com对象Q你居然没有办法知道到它I竟实现?jin)多接口?br />      最后就是消息发送了(jin)Q其能力之强大,谁用谁知道。原则上Ԍ可以看成对象拥有的虚函数表的Ҏ(gu)无穷多,又可以把每一条消息看成一个接口,那么Q对象可能就实现?jin)无I多的接口。你_(d)面对着q样对象Q还有什么做不出来呢。真用上消息发送这U隐藏无数间接层Q就没有什么Y仉题解决不?jin)的。Q何Y仉题不是通过引入间接层来解决的嘛。现在用上消息发送这U怪物Q就问你怕不怕。没有免费午,自然要付出类型安全的危险和性能上的损失?br /></div></div><img src ="http://www.shnenglu.com/huaxiazhihuo/aggbug/213491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huaxiazhihuo/" target="_blank">华夏之火</a> 2016-05-10 22:40 <a href="http://www.shnenglu.com/huaxiazhihuo/archive/2016/05/10/213491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scheme下的停机问题和Yl合?/title><link>http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/11/201689.html</link><dc:creator>华夏之火</dc:creator><author>华夏之火</author><pubDate>Thu, 11 Jul 2013 06:48:00 GMT</pubDate><guid>http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/11/201689.html</guid><wfw:comment>http://www.shnenglu.com/huaxiazhihuo/comments/201689.html</wfw:comment><comments>http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/11/201689.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/huaxiazhihuo/comments/commentRss/201689.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huaxiazhihuo/services/trackbacks/201689.html</trackback:ping><description><![CDATA[<div><div>        看过的计机书中Qscheme相关的那几本Q好比SICPQthe essence of program都很让我׃释手。而the little schemer更加独特Q编E的本质Q在q本书小Z上体现得淋漓致。窃以ؓ(f)Qscheme是语法Ş式上最为完的~程语言?jin),没有之一。少x多,q样的赞之aQ唯有scheme当之无愧Qƈ且它的确是精得不能再_?jin)。至于那个自吹自擂的什么狗语言Q不提也|。当?dng)完美q不一定代表实用,也ƈ不一定必L行,曲高一向都是和寡的Q但是,完美却一定可以带来赏?j)(zhn)目般的感受?/div>        the little schemer全书行云水Q逐渐N递归的威力,做?jin)铺垫,C(jin)W?章,真命天子lambda出现Q一切变得很有意思了(jin)Q读完之后,意犹未尽。第9章,隑ֺ陡增Q突然变得理论性v来,那是自然的。因为,q一章的主题是停机问题和Yl合子。不引入M形式化的Ҏ(gu)Q但是作者D重若轻,依然阐释得如此直白易懂,可以_(d)只要能看完前面的内容Q就一定能看懂q一章。而前八章Q据?岁以上的儿童都能看得明白?br /><div><div><div>        scheme中的函数是first classQ可以作为参C递给其他函数Q也可以作ؓ(f)g函数中返回。比如,qؓ(f)传的一道程序,用以考察语言的表达能力,“~写一个函敎ͼ其入参数为nQ返回gؓ(f)新的函数Q该函数的参Cؓ(f)xQ返回gؓ(f)之前的n与现在的x的和?#8221;用scheme来表达,牛刀试?/div><div><span style="color: #ff9900;">(define (addn n)</span><br /><span style="color: #ff9900;">  (lambda (x)</span><br /><span style="color: #ff9900;">    (+ x n)))</span><br />然后Q对?(addn 20) 30)Qscheme解释器上昄其结果ؓ(f)50Q很好。相比于那个lisp的版本,q里昑־多么的干净?br /><div>        函数式的语言对副作用Qside effectQ很敏感Q特别是haskellQ更加对副作用赶杀l,压根׃让写出有副作用的函数。因此,正常情况下,函数执行完毕Q都有返回倹{好比,……QM很多是Q正常的函数Q都可称之ؓ(f)total functionsQ意思就是对所有的参数Q都?x)有q回l果。但是,也还存在一些病态函敎ͼ它们不会(x)q回Q一旦调用它Q那么将陷入与其中,永远都不?x)返回?jin)Q显?dng)里面出现d@环了(jin)Q但是,scheme中没有@环语句,所以不能这么说QMQ这一cL不会(x)有返回值的。很Lp写出一个例子?br /><div><span style="color: #ff9900;">(define eternity</span><br /><span style="color: #ff9900;">  (lambda (x)</span><br /><span style="color: #ff9900;">    (eternity x)))</span><br /><div>eternityZ朽的意思?br />        自然有q样的问题,能否实现q样的函敎ͼ它能判断函数是否l将q回Q或者说Q判断函C(x)不会(x)停止。这个函C用可大了(jin)Q当然不?x)那么容易实现。不q,可以先假讑֮存在Q就叫它will-stop?Q别惊讶Qscheme中,标识W中可以?-*{特D符P(j)。因此,对于M函数Q?will-stop? afunction)表达式的|要么?tQ表C函数afunctionl将停止q回Q要么ؓ(f)#fQ则函数不会(x)停止Q好比eternity。显?dng)让will-stop?判断自己Q?will-stop? will-stop?)的结果一定是#t?jin)?br />        但是Qwill-stop?是不可能存在的,q不是废话吗Q地球h都知道。因机学家_ֿ(j)构造了(jin)一个反例,此反例实在y妙,真难以想象当初是如何构造出来,我等民只需理解卛_。请看代?br /><div><span style="color: #ff9900;">(define (last-try x)</span><br /><span style="color: #ff9900;">  (and (will-stop? last-try) (eternity x)))</span><br />last-tryQ好名字Q就叫它最后一d?will-stop? last-try)的结果不外乎#t?f?br />        假如?fQ说明last-try不会(x)q回Q意味着有死循环Q不?x)停止。但是,一考察last-try的内部实玎ͼ却很Ҏ(gu)q道它马上p回了(jin)。表辑ּ(and (will-stop? last-try) (eternity '()))中,由假讑֏?will-stop? last-try)?fQ进而马上可知,(and (will-stop? last-try) (eternity '()))马上必将q回#fQ也是_(d)虽然一开始假设last-try不会(x)停止Q但实际q行中last-try一下子p回了(jin)Q矛盾?br />        看样子,(will-stop? last-try)只好?t?jin)。可是,(and (will-stop? last-try) (eternity '()))Qand表达式的两个分支中,既然(will-stop? last-try)?tQ那么,势必要进一步调?eternity '())Q而eternity老爷Q一早就知道他乃不朽之n?jin),因此Qlast-try也沾光,一样不朽了(jin)。与假设?will-stop? last-try)?t为终停止,又是矛盾?/div><div>        因此Qwill-stop?接受不了(jin)last-try的挑战,p|。也是_(d)will-stop?q样的函敎ͼ不存在。这道反例的高明之处Q或者说耍赖吧,是以will-stop?为基构造了(jin)一个will-stop?无法判断的函数。假如规定,所有被(g)函数都不得直接间接的调用will-stop?Q免得will-stop?隑֠Q那么这L(fng)will-stop?能否存在呢?存不存在Q我׃知道?jin),但n受此待遇的Yl合子却是存在的?br />        函数直接或间接调用到它自己,递归׃生了(jin)。问题来?jin),函数你自己都q没实现完毕Q怎么可以自己拿来调用呢Q这个过E中Q编译器解释器肯定做?jin)某些语义上处理Q让递归得以实现。逻辑学中Q对于下定义的要求是“不得循环”Q好比,白色是一U白色的颜色Q这U废话定义就不符合下定义的基本要求了(jin)?br />        下面来将一条经典的递归函数整成非递归的版本。the little schemer的推导思\非常显易懂Q我不能做的更好的了(jin)Q因此借用?/div><div><span style="color: #ff9900;">(define length</span><br /><span style="color: #ff9900;">  (lambda (l)</span><br /><span style="color: #ff9900;">    (cond ((null? l) 0)</span><br /><span style="color: #ff9900;">      (else (+ 1 (length (cdr l)))))))</span><br />函数l(f)ength中,虽然调用C(jin)自己Q实际上Q其实只是调用了(jin)一个同样名字的函数而已。意味着Qlength的实际上的lambda表达式,背地里带多了(jin)一个参敎ͼ此参Cؓ(f)函数Q用以当入参l不ؓ(f)I时来进行用。因此,可以整个函数的定义改写成下面的lambda表达式?br /><span style="color: #ff9900;">(lambda (length)</span><br /><span style="color: #ff9900;">  (lambda (l)</span><br /><span style="color: #ff9900;">    (cond ((null? l) 0)</span><br /><span style="color: #ff9900;">      (else (+ 1 (length (cdr l)))))))</span><br />lambda表达式的q回gؓ(f)一个函敎ͼ当然没有名字?jin)。它的入参ؓ(f)一函数Q返回一个新的函敎ͼ此新函数的入参是列表Q返回列表的长度。ؓ(f)?jin)便于后文叙q引用,qdefinel它起个名字Q叫mk-length。什么,q用define起名字都不会(x)Q没救了(jin)?br />        mk-length不是需要函数入参吗Q刚好手头有一个,q它自己本w,((mk-length mk-length) '())Q解释器q回0Q太好了(jin)。然后,我满怀希望的用((mk-length mk-length) '(a))来测试,l果Q解释器报错?jin),Z么?E微一惻I明白了(jin)?mk-length mk-length)的确q回计算列表长度的函敎ͼ但是Q当列表不ؓ(f)I时Q只好用表达?+ 1 (length (cdr l)))做进一步处理,里面的length是mk-lengthQ而mk-length的入参是函数Q不是列表,于是解释器就报错?jin)。怎么办?<br />        当然Q要计算长度Z大于1的列表的长度Q还是有办法的。就是,((mk-length (mk-length mk-length)) '(a))Q这样就好了(jin)。自?dng)当列表大?Ӟ解释器必然又报错了(jin)。按照此法,为此Qؓ(f)?jin)求得不大于N个元素的列表长度Q必dmk-length写Nơ,好比Q?br /><span style="color: #ff9900;">((mk-length</span><br /><span style="color: #ff9900;">  (mk-length</span><br /><span style="color: #ff9900;">   (mk-length (...))))</span><br /><span style="color: #ff9900;"> '(a b c d ...))</span><br />q且Q辛辛苦苦的重复写N遍mk-lengthQ只能计个C大于N的列表的长度。这Q无论如何都不能让程序猿接受?br />那么Qؓ(f)何要写那么多(mk-length (mk-length (mk-length...)))Q皆因mk-length?+ 1 (length (cdr l)))的length函数接收的函数参数是列表l。先暂时让它适应环境Q就让它知道它接收的length参数是一个跟它自己本w的lambda表达一P是入参ؓ(f)函数Q然后返回一个计list长度的函数。将mk-length改写成这栗?br /><span style="color: #ff9900;">(define mk-length</span><br /><span style="color: #ff9900;">  (lambda (length)</span><br /><span style="color: #ff9900;">    (lambda (l)</span><br /><span style="color: #ff9900;">      (cond ((null? l) 0)</span><br /><span style="color: #ff9900;">        (else (+ 1 ((length length) (cdr l))))))))</span><br />h意,代码里面已经不存在递归形式?jin),因?f)Qmk-length的lambda表达式中Q没有用到mk-lengthq个名字?jin),当然Q它q要用到入参length以计当l不ؓ(f)I时的长度。再ơ抱着试试看的态度Q验证,((mk-length mk-length) '(a))Q返?Q真的可以了(jin)。拿更长的列表丢q去Q长度ؓ(f)2Qؓ(f)3Qؓ(f)N+1Q都OK?jin),真是奇?/div><div>        它的工作原理是,故事一开始,(mk-length mk-length)生成一个计列表长度的函数Q在其内部中Q假如列表l为空Q就q回长度?Q否则,pl的尾部长度,q加上头l点的长?Q而计l的尾部的函数Q是通过(length length)来生成,其中length是mk-lengthQ故事就回到原点(mk-length mk-length)?jin),只是Q其q回值在外围中要??jin),然后Q在更外围中l箋?Q加1Q?#8230;…?br />但是Q工作还没有完成Q因为,mk-length中,((length length) (cdr l))很刺|它应该是(length (cdr l))q样的Ş式。重构,必须重构。必d其提炼成一个函敎ͼ因此Qmk-length变?br /><span style="color: #ff9900;">(define mk-length</span><br /><span style="color: #ff9900;">  (lambda (length-mk)</span><br /><span style="color: #ff9900;">    ((lambda (length)</span><br /><span style="color: #ff9900;">    (lambda (l)</span><br /><span style="color: #ff9900;">      (cond ((null? l) 0)</span><br /><span style="color: #ff9900;">        (else (+ 1 (length (cdr l)))))))</span><br /><span style="color: #ff9900;">     (lambda (x)</span><br /><span style="color: #ff9900;">       ((length-mk length-mk) x)))))</span><br />代码g变得复杂些了(jin)Q但效果是一Pq且Q语法结构上基本保持一致。但是代码好像的变得更长了(jin)Q这也没办发Qؓ(f)?jin)保持最内部length的纯z性。但是,它也太深?jin),作?f)重点Q应该放在外面,嗯,应该两个lambda对调一下?br /><span style="color: #ff9900;">(define mk-length</span><br /><span style="color: #ff9900;">  (lambda (length-mk)</span><br /><span style="color: #ff9900;">    ((lambda (length)</span><br /><span style="color: #ff9900;">       (length (lambda (x)</span><br /><span style="color: #ff9900;">         ((length-mk length-mk) x))))</span><br /><span style="color: #ff9900;">     (lambda (length)</span><br /><span style="color: #ff9900;">       (lambda (l)</span><br /><span style="color: #ff9900;">     (cond ((null? l) 0)</span><br /><span style="color: #ff9900;">           (else (+ 1 (length (cdr l))))))))))</span><br />面对着q么多的lambdaQ实在难以E定。但必须接收z礼Q方可体?x)到函数作?f)一{公民,所带来的强(zhn)的表达能力Q简直能撞破?fn)惯命o(h)式编E的眼球。里面的lambda(length)又变回原来的样子Q但是,mk-length的主体已l不再是它了(jin)Q而是一个以的lambda(length)为参数的lambda?jin)。ؓ(f)?jin)保持mk-length的纯z,l箋努力Q这一ơ,是在两个(mk-length mk-length)上做文章Q每ơ都要写两个相同的函敎ͼ不如把它做成函数。事情到?jin)这一步,Yl合子已gƲ出?br /><span style="color: #ff9900;">(define Y</span><br /><span style="color: #ff9900;">  (lambda (f)</span><br /><span style="color: #ff9900;">    (f f)))</span><br /><span style="color: #ff9900;">((Y mk-length) '(a b c d e))    ;q回5</span><br />然后mk-length中的W一条length的lambda搬过来,q且作ؓ(f)两个f的入?br /><span style="color: #ff9900;">(define Y</span><br /><span style="color: #ff9900;">  (lambda (length)</span><br /><span style="color: #ff9900;">    ((lambda (f)</span><br /><span style="color: #ff9900;">       (f f))</span><br /><span style="color: #ff9900;">     (lambda (length-mk)</span><br /><span style="color: #ff9900;">       (length (lambda (x)</span><br /><span style="color: #ff9900;">         ((length-mk length-mk) x)))))))</span><br />最后,Y整得更加好看一点,也看来更加的通用Q不仅仅是针对lengthQ而是全部的需要递归的函数?br /><span style="color: #ff9900;">(define (Y f)</span><br /><span style="color: #ff9900;">  ((lambda (g) (g g))</span><br /><span style="color: #ff9900;">   (lambda (g)</span><br /><span style="color: #ff9900;">     (f</span><br /><span style="color: #ff9900;">      (lambda (x) ((g g) x))))))</span><br />再送上一道求?br /><span style="color: #ff9900;">((Y</span><br /><span style="color: #ff9900;">  (lambda (sum)</span><br /><span style="color: #ff9900;">    (lambda (n)</span><br /><span style="color: #ff9900;">      (cond ((= n 1) 1)</span><br /><span style="color: #ff9900;">        (else (+ n (sum (- n 1))))))))</span><br /><span style="color: #ff9900;"> 10)</span><br />文章已经很长?jin),打住。以后再发挥吧?/div></div></div></div></div></div></div></div><img src ="http://www.shnenglu.com/huaxiazhihuo/aggbug/201689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huaxiazhihuo/" target="_blank">华夏之火</a> 2013-07-11 14:48 <a href="http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/11/201689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言复杂声明的本质与局?/title><link>http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/01/201425.html</link><dc:creator>华夏之火</dc:creator><author>华夏之火</author><pubDate>Mon, 01 Jul 2013 07:57:00 GMT</pubDate><guid>http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/01/201425.html</guid><wfw:comment>http://www.shnenglu.com/huaxiazhihuo/comments/201425.html</wfw:comment><comments>http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/01/201425.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/huaxiazhihuo/comments/commentRss/201425.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huaxiazhihuo/services/trackbacks/201425.html</trackback:ping><description><![CDATA[<div>    先简单回一下C语言的独有的变量声明方式。自诩用C语言多年Q却一直对于C的复杂的变量声明方式头皮发麻Q直到看到VCZH大神前不久的大作Q才恍然大?zhn)。惭愧,因此下面的内定w有拾人牙慧之嫌,但ؓ(f)?jin)引出后面一pd关于语言的随W,也没办法?jin),本文的荣誉都归于vczh大神。就从最单的说v?br />    int a;    // 说明表达式a的值是int型,a自己本n也是int型,q不是废话吗Q?br />    int array[N];    // 于是Q表辑ּarray[n]的gؓ(f)int型,array是int数组Q是否废话的味道了(jin)一点?<br />    int *pA;    // 昄Q?pA的gؓ(f)int型,而pA的类型是指向int的指针?br />    int fun(int x, int y)    // 毫无疑问Q表辑ּfun(a,b)的gؓ(f)int型,fun则是函数Q其函数{֐?#8230;…<br />    通过前面例子Q说明一个道理,可以从另外一个角度来理解C变量的类型声明,先确定整个表辑ּ的结果值的cdQ再考察变量本n的类型。就好比以上几个例子QaQ单独一个变量都是表辑ּQ? array[n], *pA, fun(a,b)q些表达式都是int型,定义变量的语句的cdQ其实就是ؓ(f)?jin)说明这个语句的变量的整个表辑ּ的结果的值的cd?br />    好了(jin)Q请深呼吸,开始重口味?jin),下面的注释,其实都是废话?br />    int *fuck[N];    // *func[n]的类型ؓ(f)intQ因此,func[n]的结果类型ؓ(f)int*Q因此,func的类型ؓ(f)数组Q数l的元素为int的指?br />    int (*pfuck)(int x, int y)    // (*pfuck)(a, b)的结果类型ؓ(f)intQ看?*pfuck)Q括号内出现一元操作符*Q此物ؓ(f)求得指针的所指之内容Q然后,此内容还能进行函数调用,因此可知Qpfuck为指针,指向一函数Q该函数的签名是……。当?dng)表达式pfuck(a, b)也可以得到相同的l果Q但是,Z(jin)pfuck的类型,请坚持?*pfuck)?br />    int* (*pfuck)(int x, int y)    // *(*pfuck)(a, b)的gؓ(f)intQpfuck的类型自然是函数指针Q函数签名是有两个int型的参数Q其q回值是int*<br />    int (*func[5])(int *p);    // 毋庸|疑Q?*func[i])(int *p)的结果是int型。它表示先获取数l的一个元素,对元素解引用Q进而函数调用。显?dng)func为长?的数l,数组元素是函数指针,函数有一int*行的变量Q返回值是int型?br />    int *(*func())();    // ?j)里发麻是不是,要E定。不怎么P*(*func())()的结果始l都是int|是不是?从最外围上看Q?(...)()Q此乃一函数调用Q然后对q回D引用得到的gؓ(f)int。我们知道,C语言中,只有两物可进行函数调用的操作Q或函数Q或函数指针Q两者必居其一。有以上例子分析可知Q?(*func)()此乃对函数指针的函数调用l果求指针倹{现在,又有*(*func())();Q括号内?func()Q分明就表示func的函数调用,此函数的q回gؓ(f)指针。结合最外层的函数调用,此返回值指针指向一函数Q也是_(d)q回值是函数指针。因此表辑ּ*(*func())()Q涉?qing)到两个函数调用Q它表示内层的函数调用返回函数指针,而此函数指针再调用一ơ,其结果ؓ(f)int*Q再用上指针*q算W,整个表达式的值就为int?jin)。因此,func是一函数Q此函数q回函数指针Q函数指针指向一个无参而返回gؓ(f)int*的函数。曲折离奇,大功告成?br /><br />    好了(jin)Q该反过来想?jin),如何从变量的cd来构造其定义语句。好比,“fuck指向一个数l,其个Cؓ(f)5Q数l元素ؓ(f)函数指针Q函数签名ؓ(f)带一?int *p)参数Q返回结果是int”?br />    先考虑如何使用此变量。既然fuck是数l指针,那么Q?fuck是q回其所指向的数l,然后要得到数l的元素Q自然理所当然必须用到[]操作W了(jin)Q因此,得刎ͼ(*fuck)[i]?jin),注意Q千万切讎ͼ必须加括P否则Q?fuck[i]意味着fuck自己本n是数组?jin)。自己本w是数组Q和指向数组Q也卻I数组和数l指针的差别Q是相当大的Q其差别之大好像整型类型和整Ş指针cd。然后,必须不能忘记的是Q一元操作符*是取得指针的所指之物?br />    好了(jin)QMQ对于fuckQ我们通过(*fuck)[i]得到数组元素。既然元素又是函数指针,q而就得到Q?*(*fuck)[i])(pa)Q这个表辑ּ的gؓ(f)int。因此,{案是Q?#8220;int (*(*fuck)[5])(int *p);”?br />    代码写成q样子,真他妈的贱,玩文字游戏Q写的h费心(j)Q读的hp涂。这该死的C语言QshitQ?br />    文章H然长了(jin)Q打住。不惜对完整的类型进行分,以求得声明与使用的语法的高度一致性。C语言真是Q真是精致得让h大倒胃口?br /><br />    又:(x)有时候,对于E微复杂一点声明的常用cdQ会(x)l常出现重复的声明语法,特别是在函数指针的时候,Z(jin)拟补q种~陷Q或者说是痛苦,或者说是对于变量类型的重视QC语言提供?jin)typedef的关键字。用以代表这U声明与使用的一致性的变量的类型。在前面的例子中看到Q声明语句中的类型,只是说明变量采用q种表达式时Q它的就是这U类型。好比,int *pArray[20]Q?pArray[i]的gؓ(f)int型,但pArray却绝不是int型,Z(jin)取得pArray的类型,可借助typedefQ具体的使用如下Qtypedef int* IntArray[20];Q然后,IntArray pArray;以定义同L(fng)型的变量。又好比上例Qint *(*func())();q个函数声明好像让某些h难以理解Q用上typedef化简一下,可以重点很H出?jin)?x)<br />    typedef int* (*FunFuck)();    // FunFuck代表无参q回值是int*的函数指针类型;<br />    FunFuck func();    // 作用相当于int *(*func())()Q但含义更加鲜明?br />    可以看到Qtypedef的用法很单,不过是在q去的表辑ּ的前面加一个typedef而已。后话,typedef在C++的template中,扮演?jin)非帔R帔R要的角色Q特别是模板元编EMPL中,全部的类型演全部压在它w上Q其作用之大Q简直是惊天地泣鬼神Q没有了(jin)typedefQC++的template不过是普通简单的泛型~程Q有?jin)template对typedef的完善支持,其实是在struct/class内部中支持typedef语句Q就D?jin)tmp的横I出玎ͼDC++的template成ؓ(f)威力最恐惧Q同时语法也是最恐惧的泛型语aQ没有之一?br /><br />    l箋补充Q加上const。以上对于复杂声明的理解Q明gh一看就知道仅仅是从叛_的角度入手。要理解constQ就必须不可不提到左g(jin)。左值右值是C++中的基本概念Q三a两语也说不清楚。最_浅的看法,左值指可以被写入,也就是说能出C赋D句的左边Q右值指可读Q只能在赋D辑ּ的右辏V当?dng)一般来_(d)左值往往可以当做叛_来使用Q可写往往意味着可读。而const的作用,是原本可写的东西Q给整成只读的了(jin)。具体到表达式来_(d)是某些表达式的值具备左叛_|而const是L?jin)它的左值功能。D例说吧,q是从最单说赗?br />    int a; 表达式a的结果是int型,既是左值又是右| <br />    const int a;Qaq回的结果是intcdQ但是此l果已不再可写了(jin)Q也xa不能攑֜赋D句的左边?jin)?br />    int const a; 可这L(fng)解,先不理int constQa是一个变量,既可d可写Qconsta整成只读。int表示const a的结果类型。虽?dng)理解上这P但对~译器来_(d)const int a;和int const a;都一P都只是表达了(jin)同样的意思,a是一个整型常量?br />    const int *p;Q?pl果为int型,加上const后,*p只能M(jin)Q所以,p是整形指针,其所指的内容只能M能写Q但p本n却可写?int const *p;Q则先强?p的只L,然后再说?p为int型。其实,q两U写法的意思都一栗?br />    int *const p;Qconst 紧挨着pQ说明p本n只读。至?int *Q则表示*pcd为intQ可d。因此,p是整形指针,p本n不可写,但其所指的内容却可d可写。说实在Q不明白q样的指针变量有什么鬼用,实际的代码应该用的很才是?br />    Z(jin)表达指针的只ȝz性的概念Q不仅指针本w不能写Q连其指向的内容也不可修改,C++l于整出?jin)下面这样伟大的代码。int const *const p;或者const int * const p;。C++的这U做法,俗称致力于解册想中的问题,因ؓ(f)const与指针的l合Q实际上只有指针所指向的内容只能读很有意义Q其他的Q意义微乎其微?br />    可见Q原本C的声明用一致性的语法Q遇上const之后Q开始有Ҏ(gu)؜׃(jin)。当半\中杀出C++的引用之后,q种语法的一致性在C++中就不复存在?jin)。C++的很多语aҎ(gu),都在不同E度不同角度Q深度和q度上,形式和语义上Q给C(j)语法的精致性造成致命的各U各L(fng)冲击。以至于Q最后C++变成?jin)有史以来很隑־复杂变态恐怖的语言?jin),没有之一?/div><img src ="http://www.shnenglu.com/huaxiazhihuo/aggbug/201425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huaxiazhihuo/" target="_blank">华夏之火</a> 2013-07-01 15:57 <a href="http://www.shnenglu.com/huaxiazhihuo/archive/2013/07/01/201425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.kinbay.cn" target="_blank">޹ŷۺϾþ </a>| <a href="http://www.iqwn.cn" target="_blank">ŷԴսþþþþ</a>| <a href="http://www.fylmbd.cn" target="_blank">޾þþþþ77777</a>| <a href="http://www.mdeditor.cn" target="_blank">þþƷavˮ </a>| <a href="http://www.daidai360.cn" target="_blank">ݺɫþۺ_</a>| <a href="http://www.51hitjj.cn" target="_blank">91Ըߺþþþ</a>| <a href="http://www.xfidc.com.cn" target="_blank">޹˾þۺһ</a>| <a href="http://www.ggg13.cn" target="_blank">ƷþþþþþþѼ</a>| <a href="http://www.huanpou.cn" target="_blank">þþƷһ</a>| <a href="http://www.lbaak.cn" target="_blank">þþݾþþ</a>| <a href="http://www.wiak.cn" target="_blank">þþƷhþþƷ帣ӰԺ1421</a>| <a href="http://www.chcrw.cn" target="_blank">þþþþëƬѲ</a>| <a href="http://www.pw823.cn" target="_blank">þ</a>| <a href="http://www.jsbcly.cn" target="_blank">99ƷѾþþþþ</a>| <a href="http://www.023job.com.cn" target="_blank">ɫվþav</a>| <a href="http://www.epfb.cn" target="_blank">99ƷþþƷһ</a>| <a href="http://www.neang.cn" target="_blank">þþþùƷŮӰԺ</a>| <a href="http://www.pygsbdg.cn" target="_blank">ݺɫþۺ</a>| <a href="http://www.szmry.cn" target="_blank">Ļþ</a>| <a href="http://www.dongfangmoney.cn" target="_blank">þþþþùƷŮ </a>| <a href="http://www.h3cedu.cn" target="_blank">69Ʒþþþþ޾Ʒ</a>| <a href="http://www.uygp.cn" target="_blank">þþƷAVɫ</a>| <a href="http://www.17art.com.cn" target="_blank">99þҹɫƷվ</a>| <a href="http://www.bpdb.com.cn" target="_blank">Ʒѿþþ</a>| <a href="http://www.buniaowan.cn" target="_blank">Ļһþվ </a>| <a href="http://www.aidelu.cn" target="_blank">޹ƷþSM </a>| <a href="http://www.qnzj.org.cn" target="_blank">þþ99Ʒһ</a>| <a href="http://www.wyj340.cn" target="_blank">þۺɫHEZYO </a>| <a href="http://www.xmxfz.cn" target="_blank">޳ɫwwwþվҹ</a>| <a href="http://www.uazm.cn" target="_blank">99þó˹Ʒ</a>| <a href="http://www.bfav.cn" target="_blank">þԭav</a>| <a href="http://www.vyfx.cn" target="_blank">ŷþþXXX</a>| <a href="http://www.by6463.cn" target="_blank">91þۺ</a>| <a href="http://www.seasa.cn" target="_blank">AV12þ</a>| <a href="http://www.epfy.cn" target="_blank">þþƷŷƬ</a>| <a href="http://www.wxjdsteel.cn" target="_blank">þùۺϾƷ</a>| <a href="http://www.ttwa.com.cn" target="_blank">ɫۺϾþþþĻ</a>| <a href="http://www.shangxin.net.cn" target="_blank">þþƷAVӰ</a>| <a href="http://www.662z.cn" target="_blank">þþþŮۺ</a>| <a href="http://www.xileshun.cn" target="_blank">þþƷaĻؿ</a>| <a href="http://www.sijishi.cn" target="_blank">þþþӰԺС </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>