<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-36066724</id><updated>2011-07-07T22:41:03.496-07:00</updated><category term='Python'/><category term='Internet'/><category term='Tango'/><category term='病毒'/><category term='杂项'/><category term='DLL'/><category term='通告'/><category term='转贴'/><category term='转载'/><category term='Windump'/><category term='非技术'/><category term='函数式编程'/><category term='C++'/><category term='功夫网'/><category term='元编程'/><category term='熊猫烧香'/><category term='Ruby'/><category term='STL'/><category term='D语言'/><category term='OpenERP'/><category term='Win32'/><category term='废话'/><category term='黑色幽默'/><category term='算法'/><category term='LISP'/><category term='泛型'/><title type='text'>麦芽烦了</title><subtitle type='html'>The Few, The Proud, The Geeks.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-36066724.post-702157645718811617</id><published>2010-11-10T15:23:00.001-08:00</published><updated>2010-11-10T15:23:49.157-08:00</updated><title type='text'>ddd</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-702157645718811617?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/702157645718811617/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=702157645718811617&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/702157645718811617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/702157645718811617'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2010/11/ddd.html' title='ddd'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-2494236478299967829</id><published>2009-10-16T07:51:00.001-07:00</published><updated>2009-10-16T19:18:21.273-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LISP'/><category scheme='http://www.blogger.com/atom/ns#' term='转贴'/><category scheme='http://www.blogger.com/atom/ns#' term='函数式编程'/><title type='text'>[转贴]Lisp的本质(The Nature of Lisp)</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-size:180%;"&gt;&lt;b&gt;Lisp 的本质(The Nature of Lisp)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left; color: rgb(102, 102, 102);"&gt;作者 Slava Akhmechet&lt;/div&gt;&lt;p style="text-align: left; color: rgb(102, 102, 102);"&gt;译者 Alec Jang&lt;/p&gt;&lt;div style="text-align: left; color: rgb(102, 102, 102);"&gt;出处: http://www.defmacro.org/ramblings/lisp.html&lt;br /&gt;中文版出处：http://www.cnblogs.com/Leap-abead/articles/762180.html&lt;/div&gt;&lt;h1&gt;简介&lt;br /&gt;&lt;/h1&gt;&lt;p&gt;最初在web的某些角落偶然看到有人赞美Lisp时, 我那时已经是一个颇有经验的程序员。在我的履历上, 掌握的语言范围相当广泛, 象C++, Java, C#主流语言等等都不在话下,我觉得我差不多知道所有的有关编程语言的事情对待编程语言的问题上, 我觉得自己不太会遇到什么大问题。其实我大错特错了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我试着学了一下Lisp, 结果马上就撞了墙。我被那些范例代码吓坏了。我想很多初次接触 Lisp 语言的人, 一定也有过类似的感受。Lisp的语法太次了。一个语言的发明人, 居然不肯用心弄出一套漂亮的语法, 那谁还会愿意学它。反正, 我是确确实实被那些难看的无数的括号搞蒙了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;回过神来之后, 我和Lisp社区的那伙人交谈, 诉说我的沮丧心情。结果, 立马就有一大套理论砸过来, 这套理论在Lisp社区处处可见, 几成惯例。比如说: Lisp的括号只是表面现象; Lisp的代码和数据的表达方式没有差别, 而且比XML语法高明许多, 所以有无穷的好处; Lisp有强大无比的元语言能力, 程序员可以写出自我维护的代码; Lisp可以创造出针对特定应用的语言子集; Lisp的运行时和编译时没有明确的分界; 等等, 等等, 等等。这么长的赞美词虽然看起来相当动人, 不过对我毫无意义。没人能给我演示这些东西是如何应用的, 因为这些东西一般来说只有在大型系统才会用到。我争辩说, 这些东西传统语言一样办得到。在和别人争论了数个小时之后, 我最终还是放弃了学Lisp的念头。为什么要花费几个月的时间学习语法这么难看的语言呢? 这种语言的概念这么晦涩, 又没什么好懂的例子。也许这语言不是该我这样的人学的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;几个月来, 我承受着这些Lisp辩护士对我心灵的重压。我一度陷入了困惑。我认识一些绝顶聪明的人, 我对他们相当尊敬, 我看到他们对Lisp的赞美达到了宗教般的高度。这就是说, Lisp中一定有某种神秘的东西存在, 我不能忍受自己对此的无知, 好奇心和求知欲最终不可遏制。我于是咬紧牙关埋头学习Lisp, 经过几个月的时间费劲心力的练习, 终于,我看到了那无穷无尽的泉水的源头。在经过脱胎换骨的磨练之后, 在经过七重地狱的煎熬&lt;/p&gt;&lt;p&gt;之后, 终于, 我明白了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;顿悟在突然之间来临。曾经许多次, 我听到别人引用雷蒙德(译者注: 论文&amp;lt;&amp;lt;大教堂和市集&amp;gt;&amp;gt;的作者, 著名的黑客社区理论家)的话: "Lisp语言值得学习。当你学会Lisp之后, 你会拥有深刻的体验。就算你平常并不用Lisp编程, 它也会使你成为更加优秀的程序员"。过去, 我根本不懂这些话的含义, 我也不相信这是真的。可是现在我懂得了。这些话蕴含的真理远远超过我过去的想像。我内心体会到一种神圣的情感, 一瞬间的顿悟, 几乎使我&lt;/p&gt;&lt;p&gt;对电脑科学的观念发生了根本的改变。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;顿悟的那一刻, 我成了Lisp的崇拜者。我体验到了宗教大师的感受: 一定要把我的知识传布开来, 至少要让10个迷失的灵魂得到拯救。按照通常的办法, 我把这些道理(就是刚开始别人砸过来的那一套, 不过现在我明白了真实的含义)告诉旁人。结果太令人失望了,只有少数几个人在我坚持之下, 发生了一点兴趣, 但是仅仅看了几眼Lisp代码, 他们就退却了。照这样的办法, 也许费数年功夫能造就了几个Lisp迷, 但我觉得这样的结果太差强&lt;/p&gt;&lt;p&gt;人意了, 我得想一套有更好的办法。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我深入地思考了这个问题。是不是Lisp有什么很艰深的东西, 令得那么多老练的程序员都不能领会? 不是, 没有任何绝对艰深的东西。因为我能弄懂, 我相信其他人也一定能。那么问题出在那里? 后来我终于找到了答案。我的结论就是, 凡是教人学高级概念, 一定要从他已经懂得的东西开始。如果学习过程很有趣, 学习的内容表达得很恰当, 新概念就会变得相当直观。这就是我的答案。所谓元编程, 所谓数据和代码形式合一, 所谓自修改代码, 所谓特定应用的子语言, 所有这些概念根本就是同族概念, 彼此互为解释, 肯定越讲越不明白。还是从实际的例子出发最有用。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我把我的想法说给Lisp程序员听, 遭到了他们的反对。"这些东西本身当然不可能用熟悉的知识来解释, 这些概念完全与众不同, 你不可能在别人已有的经验里找到类似的东西",可是我认为这些都是遁词。他们又反问我, "你自己为啥不试一下?" 好吧, 我来试一下。这篇文章就是我尝试的结果。我要用熟悉的直观的方法来解释Lisp, 我希望有勇气的人读完它, 拿杯饮料, 深呼吸一下, 准备被搞得晕头转向。来吧, 愿你获得大能。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;重新审视XML&lt;/h1&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;千里之行始于足下。让我们的第一步从XML开始。可是XML已经说得更多的了, 还能有什么新意思可说呢? 有的。XML自身虽然谈谈不上有趣, 但是XML和Lisp的关系却相当有趣。XML和Lisp的概念有着惊人的相似之处。XML是我们通向理解Lisp的桥梁。好吧, 我们且把XML当作活马医。让我们拿好手杖, 对XML的无人涉及的荒原地带作一番探险。我们要从一个全新的视角来考察这个题目。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;表面上看, XML是一种标准化语法, 它以适合人阅读的格式来表达任意的层次化数据(hirearchical data)。象任务表(to-do list), 网页, 病历, 汽车保险单, 配置文件等等, 都是XML用武的地方。比如我们拿任务表做例子:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&amp;lt;todo name="housework"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;item priority="high"&amp;gt;Clean the house.&amp;lt;/item&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;item priority="medium"&amp;gt;Wash the dishes.&amp;lt;/item&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;item priority="medium"&amp;gt;Buy more soap.&amp;lt;/item&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&amp;lt;/todo&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;解析这段数据时会发生什么情况? 解析之后的数据在内存中怎样表示? 显然, 用树来表示这种层次化数据是很恰当的。说到底, XML这种比较容易阅读的数据格式, 就是树型结构数据经过序列化之后的结果。任何可以用树来表示的数据, 同样可以用XML来表示, 反之亦然。希望你能懂得这一点, 这对下面的内容极其重要。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;再进一步。还有什么类型的数据也常用树来表示? 无疑列表(list)也是一种。上过编译课吧? 还模模糊糊记得一点吧? 源代码在解析之后也是用树结构来存放的, 任何编译程序都会把源代码解析成一棵抽象语法树, 这样的表示法很恰当, 因为源代码就是层次结构的：函数包含参数和代码块, 代码快包含表达式和语句, 语句包含变量和运算符等等。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们已经知道, 任何树结构都可以轻而易举的写成XML, 而任何代码都会解析成树, 因此,任何代码都可以转换成XML, 对不对? 我举个例子, 请看下面的函数:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;int add(int arg1, int arg2)&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;{&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    return arg1+arg2;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;能把这个函数变成对等的XML格式吗? 当然可以。我们可以用很多种方式做到, 下面是其中的一种, 十分简单:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&amp;lt;define-function return-type="int" name="add"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;arguments&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;argument type="int"&amp;gt;arg1&amp;lt;/argument&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;argument type="int"&amp;gt;arg2&amp;lt;/argument&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;/arguments&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;body&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;return&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;            &amp;lt;add value1="arg1" value2="arg2" /&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;/return&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;/body&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&amp;lt;/define&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这个例子非常简单, 用哪种语言来做都不会有太大问题。我们可以把任何程序码转成XML,也可以把XML转回到原来的程序码。我们可以写一个转换器, 把Java代码转成XML, 另一个转换器把XML转回到Java。一样的道理, 这种手段也可以用来对付C++(这样做跟发疯差不多么。可是的确有人在做, 看看GCC-XML(http://www.gccxml.org)就知道了)。进一步说,凡是有相同语言特性而语法不同的语言, 都可以把XML当作中介来互相转换代码。实际上几乎所有的主流语言都在一定程度上满足这个条件。我们可以把XML作为一种中间表示法,在两种语言之间互相译码。比方说, 我们可以用Java2XML把Java代码转换成XML, 然后用XML2CPP再把XML转换成C++代码, 运气好的话, 就是说, 如果我们小心避免使用那些C++不具备的Java特性的话, 我们可以得到完好的C++程序。这办法怎么样, 漂亮吧?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这一切充分说明, 我们可以把XML作为源代码的通用存储方式, 其实我们能够产生一整套使用统一语法的程序语言, 也能写出转换器, 把已有代码转换成XML格式。如果真的采纳这种办法, 各种语言的编译器就用不着自己写语法解析了, 它们可以直接用XML的语法解析来直接生成抽象语法树。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;说到这里你该问了, 我们研究了这半天XML, 这和Lisp有什么关系呢? 毕竟XML出来之时,Lisp早已经问世三十年了。这里我可以保证, 你马上就会明白。不过在继续解释之前, 我们先做一个小小的思维练习。看一下上面这个XML版本的add函数例子, 你怎样给它分类,是代码还是数据? 不用太多考虑都能明白, 把它分到哪一类都讲得通。它是XML, 它是标准格式的数据。我们也知道, 它可以通过内存中的树结构来生成(GCC-XML做的就是这个事&lt;/p&gt;&lt;p&gt;情)。它保存在不可执行的文件中。我们可以把它解析成树节点, 然后做任意的转换。显而易见, 它是数据。不过且慢, 虽然它语法有点陌生, 可它又确确实实是一个add函数,对吧?  一旦经过解析, 它就可以拿给编译器编译执行。我们可以轻而易举写出这个XML代码解释器, 并且直接运行它。或者我们也可以把它译成Java或C++代码, 然后再编译运行。所以说, 它也是代码。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们说到那里了? 不错, 我们已经发现了一个有趣的关键之点。过去被认为很难解的概念已经非常直观非常简单的显现出来。代码也是数据, 并且从来都是如此。这听起来疯疯癫癫的, 实际上却是必然之事。我许诺过会以一种全新的方式来解释Lisp, 我要重申我的许诺。但是我们此刻还没有到预定的地方, 所以还是先继续上边的讨论。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;刚才我说过, 我们可以非常简单地实现XML版的add函数解释器, 这听起来好像不过是说说而已。谁真的会动手做一下呢? 未必有多少人会认真对待这件事。随便说说, 并不打算真的去做, 这样的事情你在生活中恐怕也遇到吧。你明白我这样说的意思吧, 我说的有没有打动你? 有哇, 那好, 我们继续。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;重新审视Ant&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;我们现在已经来到了月亮背光的那一面, 先别忙着离开。再探索一下, 看看我们还能发现什么东西。闭上眼睛, 想一想2000年冬天的那个雨夜, 一个名叫James Duncan Davidson的杰出的程序员正在研究Tomcat的servlet容器。那时, 他正小心地保存好刚修改过的文件, 然后执行make。结果冒出了一大堆错误, 显然有什么东西搞错了。经过仔细检查, 他想, 难道是因为tab前面加了个空格而导致命令不能执行吗? 确实如此。老是这样, 他真&lt;/p&gt;&lt;p&gt;的受够了。乌云背后的月亮给了他启示, 他创建了一个新的Java项目, 然后写了一个简单但是十分有用的工具, 这个工具巧妙地利用了Java属性文件中的信息来构造工程, 现在James可以写makefile的替代品, 它能起到相同的作用, 而形式更加优美, 也不用担心有makefile那样可恨的空格问题。这个工具能够自动解释属性文件, 然后采取正确的动作来编译工程。真是简单而优美。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;(作者注: 我不认识James, James也不认识我, 这个故事是根据网上关于Ant历史的帖子虚构的)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;使用Ant构造Tomcat之后几个月, 他越来越感到Java的属性文件不足以表达复杂的构造指令。文件需要检出, 拷贝, 编译, 发到另外一台机器, 进行单元测试。要是出错, 就发邮件给相关人员, 要是成功, 就继续在尽可能高层的卷(volumn)上执行构造。追踪到最后,卷要回复到最初的水平上。确实, Java的属性文件不够用了, James需要更有弹性的解决方案。他不想自己写解析器(因为他更希望有一个具有工业标准的方案)。XML看起来是个不错的选择。他花了几天工夫把Ant移植到XML，于是，一件伟大的工具诞生了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Ant是怎样工作的？原理非常简单。Ant把包含有构造命令的XML文件(算代码还是算数据,你自己想吧)，交给一个Java程序来解析每一个元素，实际情况比我说的还要简单得多。一个简单的XML指令会导致具有相同名字的Java类装入，并执行其代码。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;copy todir="../new/dir"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;fileset dir="src_dir" /&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;/copy&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这段文字的含义是把源目录复制到目标目录，Ant会找到一个"copy"任务(实际上就是一个Java类), 通过调用Java的方法来设置适当参数(todir和fileset)，然后执行这个任务。Ant带有一组核心类, 可以由用户任意扩展, 只要遵守若干约定就可以。Ant找到这些类,每当遇到XML元素有同样的名字, 就执行相应的代码。过程非常简单。Ant做到了我们前面所说的东西: 它是一个语言解释器, 以XML作为语法, 把XML元素转译为适当的Java指令。我们可以写一个"add"任务, 然后, 当发现XML中有add描述的时候, 就执行这个add任务。由于Ant是非常流行的项目, 前面展示的策略就显得更为明智。毕竟, 这个工具每天差不多有几千家公司在使用。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;到目前为之, 我还没有说Ant在解析XML时所遇到困难。你也不用麻烦去它的网站上去找答案了, 不会找到有价值的东西。至少对我们这个论题来说是如此。我们还是继续下一步讨论吧。我们答案就在那里。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;为什么是XML&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;有时候正确的决策并非完全出于深思熟虑。我不知道James选择XML是否出于深思熟虑。也许仅仅是个下意识的决定。至少从James在Ant网站上发表的文章看起来, 他所说的理由完全是似是而非。他的主要理由是移植性和扩展性, 在Ant案例上, 我看不出这两条有什么帮助。使用XML而不是Java代码, 到底有什么好处? 为什么不写一组Java类, 提供api来满足基本任务(拷贝目录, 编译等等), 然后在Java里直接调用这些代码? 这样做仍然可以保证移植性, 扩展性也是毫无疑问的。而且语法也更为熟悉, 看着顺眼。那为什么要用 XML呢? 有什么更好的理由吗?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;有的。虽然我不确定James是否确实意识到了。在语义的可构造性方面, XML的弹性是Java望尘莫及的。我不想用高深莫测的名词来吓唬你, 其中的道理相当简单, 解释起来并不费很多功夫。好, 做好预备动作, 我们马上就要朝向顿悟的时刻做奋力一跃。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;上面的那个copy的例子, 用Java代码怎样实现呢? 我们可以这样做:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    CopyTask copy = new CopyTask();&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    Fileset fileset = new Fileset();&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    fileset.setDir("src_dir");&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    copy.setToDir("../new/dir");&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    copy.setFileset(fileset);&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    copy.excute();&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这个代码看起来和XML的那个很相似, 只是稍微长一点。差别在那里? 差别在于XML构造了一个特殊的copy动词, 如果我们硬要用Java来写的话, 应该是这个样子:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    copy("../new/dir");&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    {&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        fileset("src_dir");&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;看到差别了吗? 以上代码(如果可以在Java中用的化), 是一个特殊的copy算符, 有点像for循环或者Java5中的foreach循环。如果我们有一个转换器, 可以把XML转换到Java, 大概就会得到上面这段事实上不可以执行的代码。因为Java的技术规范是定死的, 我们没有办法在程序里改变它。我们可以增加包, 增加类, 增加方法, 但是我们没办法增加算符,而对于XML, 我们显然可以任由自己增加这样的东西。对于XML的语法树来说, 只要原意,我们可以任意增加任何元素, 因此等于我们可以任意增加算符。如果你还不太明白的话,看下面这个例子, 加入我们要给Java引入一个unless算符:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    unless(someObject.canFly())&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    {&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        someObject.transportByGround():&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;在上面的两个例子中, 我们打算给Java语法扩展两个算符, 成组拷贝文件算符和条件算符unless, 我们要想做到这一点, 就必须修改Java编译器能够接受的抽象语法树, 显然我们无法用Java标准的功能来实现它。但是在XML中我们可以轻而易举地做到。我们的解析器根据 XML元素, 生成抽象语法树, 由此生成算符, 所以, 我们可以任意引入任何算符。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;对于复杂的算符来说, 这样做的好处显而易见。比如, 用特定的算符来做检出源码, 编译文件, 单元测试, 发送邮件等任务, 想想看有多么美妙。对于特定的题目, 比如说构造软件项目, 这些算符的使用可以大幅减低少代码的数量。增加代码的清晰程度和可重用性。解释性的XML可以很容易的达到这个目标。XML是存储层次化数据的简单数据文件, 而在Java中, 由于层次结构是定死的(你很快就会看到, Lisp的情况与此截然不同), 我们就没法达到上述目标。也许这正是Ant的成功之处呢。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;你可以注意一下最近Java和C#的变化(尤其是C#3.0的技术规范), C#把常用的功能抽象出来, 作为算符增加到C#中。C#新增加的query算符就是一个例子。它用的还是传统的作法:C#的设计者修改抽象语法树, 然后增加对应的实现。如果程序员自己也能修改抽象语法树该有多好! 那样我们就可以构造用于特定问题的子语言(比如说就像Ant这种用于构造项目的语言), 你能想到别的例子吗? 再思考一下这个概念。不过也不必思考太甚, 我们待会还会回到这个题目。那时候就会更加清晰。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;离Lisp越来越近&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;我们先把算符的事情放一放, 考虑一下Ant设计局限之外的东西。我早先说过, Ant可以通过写Java类来扩展。Ant解析器会根据名字来匹配XML元素和Java类, 一旦找到匹配, 就执行相应任务。为什么不用Ant自己来扩展Ant呢? 毕竟核心任务要包含很多传统语言的结构(例如"if"), 如果Ant自身就能提供构造任务的能力(而不是依赖java类), 我们就可以得到更高的移植性。我们将会依赖一组核心任务(如果你原意, 也不妨把它称作标准库), 而&lt;/p&gt;&lt;p&gt;不用管有没有Java 环境了。这组核心任务可以用任何方式来实现, 而其他任务建筑在这组核心任务之上, 那样的话, Ant就会成为通用的, 可扩展的, 基于XML的编程语言。考虑下面这种代码的可能性:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    &amp;lt;task name="Test"&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;echo message="Hello World" /&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;/task&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;Test /&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;如果XML支持"task"的创建, 上面这段代码就会输出"Hello World!". 实际上, 我们可以用Java写个"task"任务, 然后用Ant-XML来扩展它。Ant可以在简单原语的基础上写出更复杂的原语, 就像其他编程语言常用的作法一样。这也就是我们一开始提到的基于XML的编程语言。这样做用处不大(你知道为甚么吗?), 但是真的很酷。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;再看一回我们刚才说的Task任务。祝贺你呀, 你在看Lisp代码!!! 我说什么? 一点都不像Lisp吗? 没关系, 我们再给它收拾一下。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;比XML更好&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;前面一节说过, Ant自我扩展没什么大用, 原因在于XML很烦琐。对于数据来说, 这个问题还不太大, 但如果代码很烦琐的话, 光是打字上的麻烦就足以抵消它的好处。你写过Ant的脚本吗? 我写过, 当脚本达到一定复杂度的时候, XML非常让人厌烦。想想看吧, 为了写结束标签, 每个词都得打两遍, 不发疯算好的!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;为了解决这个问题, 我们应当简化写法。须知, XML仅仅是一种表达层次化数据的方式。我们并不是一定要使用尖括号才能得到树的序列化结果。我们完全可以采用其他的格式。其中的一种(刚好就是Lisp所采用的)格式, 叫做s表达式。s表达式要做的和XML一样, 但它的好处是写法更简单, 简单的写法更适合代码输入。后面我会详细讲s表达式。这之前我要清理一下XML的东西。考虑一下关于拷贝文件的例子:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    &amp;lt;copy toDir="../new/dir"&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;fileset dir="src_dir"&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;/copy&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;想想看在内存里面, 这段代码的解析树在内存会是什么样子? 会有一个"copy"节点, 其下有一个 "fileset"节点, 但是属性在哪里呢? 它怎样表达呢? 如果你以前用过XML, 并且弄不清楚该用元素还是该用属性, 你不用感到孤单, 别人一样糊涂着呢。没人真的搞得清楚。这个选择与其说是基于技术的理由, 还不如说是闭着眼瞎摸。从概念上来讲, 属性也是一种元素, 任何属性能做的, 元素一样做得到。XML引入属性的理由, 其实就是为了让XML写法不那么冗长。比如我们看个例子:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    &amp;lt;copy&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;toDir&amp;gt;../new/dir&amp;lt;/toDir&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;fileset&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;            &amp;lt;dir&amp;gt;src_dir&amp;lt;/dir&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;/fileset&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;/copy&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;两下比较, 内容的信息量完全一样, 用属性可以减少打字数量。如果XML没有属性的话,光是打字就够把人搞疯掉。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;说完了属性的问题, 我们再来看一看s表达式。之所以绕这么个弯, 是因为s表达式没有属性的概念。因为s表达式非常简练, 根本没有必要引入属性。我们在把XML转换成s表达式的时候, 心里应该记住这一点。看个例子, 上面的代码译成s表达式是这样的:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    (copy &lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        (todir "../new/dir")&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        (fileset (dir "src_dir")))&lt;/p&gt;&lt;p&gt;&lt;br /&gt;仔细看看这个例子, 差别在哪里? 尖括号改成了圆括号, 每个元素原来是有一对括号标记包围的, 现在取消了后一个(就是带斜杠的那个)括号标记。表示元素的结束只需要一个")"就可以了。不错, 差别就是这些。这两种表达方式的转换, 非常自然, 也非常简单。s表达式打起字来, 也省事得多。第一次看s表达式(Lisp)时, 括号很烦人是吧? 现在我们明白了背后的道理, 一下子就变得容易多了。至少, 比XML要好的多。用s表达式写代码, 不&lt;/p&gt;&lt;p&gt;单是实用, 而且也很让人愉快。s表达式具有XML的一切好处, 这些好处是我们刚刚探讨过的。现在我们看看更加Lisp风格的task例子:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    (task (name "Test")&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        (echo (message "Hellow World!")))&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (Test)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;用Lisp的行话来讲, s表达式称为表(list)。对于上面的例子, 如果我们写的时候不加换行, 用逗号来代替空格, 那么这个表达式看起来就非常像一个元素列表, 其中又嵌套着其他标记。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    (task, (name, "test"), (echo, (message, "Hello World!")))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;XML自然也可以用这样的风格来写。当然上面这句并不是一般意义上的元素表。它实际上是一个树。这和XML的作用是一样的。称它为列表, 希望你不会感到迷惑, 因为嵌套表和树实际上是一码事。Lisp的字面意思就是表处理(list processing), 其实也可以称为树处理, 这和处理XML节点没有什么不同。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;经受这一番折磨以后, 现在我们终于相当接近Lisp了, Lisp的括号的神秘本质(就像许多Lisp狂热分子认为的)逐渐显现出来。现在我们继续研究其他内容。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;重新审视C语言的宏&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;到了这里, 对XML的讨论你大概都听累了, 我都讲累了。我们先停一停, 把树, s表达式,Ant这些东西先放一放, 我们来说说C的预处理器。一定有人问了, 我们的话题和C有什么关系? 我们已经知道了很多关于元编程的事情, 也探讨过专门写代码的代码。理解这问题有一定难度, 因为相关讨论文章所使用的编程语言, 都是你们不熟悉的。但是如果只论概念的话, 就相对要简单一些。我相信, 如果以C语言做例子来讨论元编程, 理解起来一定会容易得多。好, 我们接着看。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;一个问题是, 为什么要用代码来写代码呢? 在实际的编程中, 怎样做到这一点呢? 到底元编程是什么意思? 你大概已经听说过这些问题的答案, 但是并不懂得其中缘由。为了揭示背后的真理, 我们来看一下一个简单的数据库查询问题。这种题目我们都做过。比方说,直接在程序码里到处写SQL语句来修改表(table)里的数据, 写多了就非常烦人。即便用C#3.0的LINQ, 仍然不减其痛苦。写一个完整的SQL查询(尽管语法很优美)来修改某人的地址, 或者查找某人的名字, 绝对是件令程序员倍感乏味的事情, 那么我们该怎样来解决这个问题? 答案就是: 使用数据访问层。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;概念挺简单, 其要点是把数据访问的内容(至少是那些比较琐碎的部分)抽象出来, 用类来映射数据库的表, 然后用访问对象属性访问器(accessor)的办法来间接实现查询。这样就极大地简化了开发工作量。我们用访问对象的方法(或者属性赋值, 这要视你选用的语言而定)来代替写SQL查询语句。凡是用过这种方法的人, 都知道这很节省时间。当然, 如果你要亲自写这样一个抽象层, 那可是要花非常多的时间的--你要写一组类来映射表, 把属性访问转换为SQL查询, 这个活相当耗费精力。用手工来做显然是很不明智的。但是一旦你有了方案和模板, 实际上就没有多少东西需要思考的。你只需要按照同样的模板一次又一次重复编写相似代码就可以了。事实上很多人已经发现了更好的方法, 有一些工具可以帮助你连接数据库, 抓取数据库结构定义(schema), 按照预定义的或者用户定制的模板来自动编写代码。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;如果你用过这种工具, 你肯定会对它的神奇效果深为折服。往往只需要鼠标点击数次, 就可以连接到数据库, 产生数据访问源码, 然后把文件加入到你的工程里面, 十几分钟的工作, 按照往常手工方式来作的话, 也许需要数百个小时人工(man-hours)才能完成。可是,如果你的数据库结构定义后来改变了怎么办? 那样的话, 你只需把这个过程重复一遍就可以了。甚至有一些工具能自动完成这项变动工作。你只要把它作为工程构造的一部分, 每次编译工程的时候, 数据库部分也会自动地重新构造。这真的太棒了。你要做的事情基本上减到了0。如果数据库结构定义发生了改变, 并在编译时自动更新了数据访问层的代码,那么程序中任何使用过时的旧代码的地方, 都会引发编译错误。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;数据访问层是个很好的例子, 这样的例子还有好多。从GUI样板代码, WEB代码, COM和CORBA存根, 以及MFC和ATL等等。在这些地方, 都是有好多相似代码多次重复。既然这些代码有可能自动编写, 而程序员时间又远远比CPU时间昂贵, 当然就产生了好多工具来自动生成样板代码。这些工具的本质是什么呢? 它们实际上就是制造程序的程序。它们有一个神秘的名字, 叫做元编程。所谓元编程的本义, 就是如此。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;元编程本来可以用到无数多的地方, 但实际上使用的次数却没有那么多。归根结底, 我们心里还是在盘算, 假设重复代码用拷贝粘贴的话, 大概要重复6,7次, 对于这样的工作量,值得专门建立一套生成工具吗? 当然不值得。数据访问层和COM存根往往需要重用数百次,甚至上千次, 所以用工具生成是最好的办法。而那些仅仅是重复几次十几次的代码, 是没有必要专门做工具的。不必要的时候也去开发代码生成工具, 那就显然过度估计了代码生成的好处。当然, 如果创建这类工具足够简单的话, 还是应当尽量多用, 因为这样做必然会节省时间。现在来看一下有没有合理的办法来达到这个目的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;现在, C预处理器要派上用场了。我们都用过C/C++的预处理器, 我们用它执行简单的编译指令, 来产生简单的代码变换(比方说, 设置调试代码开关), 看一个例子:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    #define triple(X) X+X+X&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这一行的作用是什么? 这是一个简单的预编译指令, 它把程序中的triple(X)替换称为X+X+X。例如, 把所有triple(5)都换成5+5+5, 然后再交给编译器编译。这就是一个简单的代码生成的例子。要是C的预处理器再强大一点, 要是能够允许连接数据库, 要是能多一些其他简单的机制, 我们就可以在我们程序的内部开发自己的数据访问层。下面这个例子, 是一个假想的对C宏的扩展:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    #get-db-schema("127.0.0.1")&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    #iterate-through-tables&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    #for-each-table&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        class #table-name&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;            {&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;            };&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    #end-for-each&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们连接数据库结构定义, 遍历数据表, 然后对每个表创建一个类, 只消几行代码就完成了这个工作。这样每次编译工程的时候, 这些类都会根据数据库的定义同步更新。显而易见, 我们不费吹灰之力就在程序内部建立了一个完整的数据访问层, 根本用不着任何外部工具。当然这种作法有一个缺点, 那就是我们得学习一套新的"编译时语言", 另一个缺点就是根本不存在这么一个高级版的C预处理器。需要做复杂代码生成的时候, 这个语言(译者注: 这里指预处理指令, 即作者所说的"编译时语言")本身也一定会变得相当复杂。它必须支持足够多的库和语言结构。比如说我们想要生成的代码要依赖某些ftp服务器上的文件, 预处理器就得支持ftp访问, 仅仅因为这个任务而不得不创造和学习一门新的语言,真是有点让人恶心(事实上已经存在着有此能力的语言, 这样做就更显荒谬)。我们不妨再灵活一点, 为什么不直接用 C/C++自己作为自己的预处理语言呢?  这样子的话, 我们可以发挥语言的强大能力, 要学的新东西也只不过是几个简单的指示字 , 这些指示字用来区别编译时代码和运行时代码。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    &amp;lt;%&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        cout&amp;lt;&amp;lt;"Enter a number: ";&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        cin&amp;gt;&amp;gt;n;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    %&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    for(int i=0;i&amp;lt; &amp;lt;% n %&amp;gt;;i++)&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    {&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        cout&amp;lt;&amp;lt;"hello"&amp;lt;&amp;lt;endl;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;你明白了吗? 在&amp;lt;%和%&amp;gt;标记之间的代码是在编译时运行的, 标记之外的其他代码都是普通代码。编译程序时, 系统会提示你输入一个数, 这个数在后面的循环中会用到。而for循环的代码会被编译。假定你在编译时输入5, for循环的代码将会是:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    for(int i=0;i&amp;lt;5; i++)&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    {&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        cout&amp;lt;&amp;lt;"hello"&amp;lt;&amp;lt;endl;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;又简单又有效率, 也不需要另外的预处理语言。我们可以在编译时就充分发挥宿主语言(此处是C/C++)的强大能力, 我们可以很容易地在编译时连接数据库, 建立数据访问层, 就像JSP或者ASP创建网页那样。我们也用不着专门的窗口工具来另外建立工程。我们可以在代码中立即加入必要的工具。我们也用不着顾虑建立这种工具是不是值得, 因为这太容易了, 太简单了。这样子不知可以节省多少时间啊。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;你好, Lisp&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;到此刻为止, 我们所知的关于Lisp的指示可以总结为一句话: Lisp是一个可执行的语法更优美的XML, 但我们还没有说Lisp是怎样做到这一点的, 现在开始补上这个话题。 &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Lisp有丰富的内置数据类型, 其中的整数和字符串和其他语言没什么分别。像71或者"hello"这样的值, 含义也和C++或者Java这样的语言大体相同。真正有意思的三种类型是符号(symbol), 表和函数。这一章的剩余部分, 我都会用来介绍这几种类型, 还要介绍Lisp环境是怎样编译和运行源码的。这个过程用Lisp的术语来说通常叫做求值。通读这一节内容, 对于透彻理解元编程的真正潜力, 以及代码和数据的同一性, 和面向领域语言的观念, 都极其重要。万勿等闲视之。我会尽量讲得生动有趣一些, 也希望你能获得一些启发。那好, 我们先讲符号。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;大体上, 符号相当于C++或Java语言中的标志符, 它的名字可以用来访问变量值(例如currentTime, arrayCount, n, 等等), 差别在于, Lisp中的符号更加基本。在C++或Java里面, 变量名只能用字母和下划线的组合, 而Lisp的符号则非常有包容性, 比如, 加号(+)就是一个合法的符号, 其他的像-, =, hello-world, *等等都可以是符号名。符号名的命名规则可以在网上查到。你可以给这些符号任意赋值, 我们这里先用伪码来说明这一点。假定函数set是给变量赋值(就像等号=在C++和Java里的作用), 下面是我们的例子:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    set(test, 5)            // 符号test的值为5&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    set(=, 5)               // 符号=的值为5&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    set(test, "hello")      // 符号test的值为字符串"hello"&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    set(test, =)            // 此时符号=的值为5, 所以test的也为5&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    set(*, "hello")         // 符号*的值为"hello"&lt;/p&gt;&lt;p&gt;&lt;br /&gt;好像有什么不对的地方? 假定我们对*赋给整数或者字符串值, 那做乘法时怎么办? 不管怎么说, *总是乘法呀? 答案简单极了。Lisp中函数的角色十分特殊, 函数也是一种数据类型, 就像整数和字符串一样, 因此可以把它赋值给符号。乘法函数Lisp的内置函数, 默认赋给*, 你可以把其他函数赋值给*, 那样*就不代表乘法了。你也可以把这函数的值存到另外的变量里。我们再用伪码来说明一下:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    *(3,4)          // 3乘4, 结果是12&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    set(temp, *)    // 把*的值, 也就是乘法函数, 赋值给temp&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    set(*, 3)       // 把3赋予*&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    *(3,4)          // 错误的表达式, *不再是乘法, 而是数值3&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    temp(3,4)       // temp是乘法函数, 所以此表达式的值为3乘4等于12&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    set(*, temp)    // 再次把乘法函数赋予*&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    *(3,4)          // 3乘4等于12&lt;/p&gt;&lt;p&gt;&lt;br /&gt;再古怪一点, 把减号的值赋给加号:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    set(+, -)       // 减号(-)是内置的减法函数&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    +(5, 4)         // 加号(+)现在是代表减法函数, 结果是5减4等于1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这只是举例子, 我还没有详细讲函数。Lisp中的函数是一种数据类型, 和整数, 字符串,符号等等一样。一个函数并不必然有一个名字, 这和C++或者Java语言的情形很不相同。在这里函数自己代表自己。事实上它是一个指向代码块的指针, 附带有一些其他信息(例如一组参数变量)。只有在把函数赋予其他符号时, 它才具有了名字, 就像把一个数值或字符串赋予变量一样的道理。你可以用一个内置的专门用于创建函数的函数来创建函数,然后把它赋值给符号fn, 用伪码来表示就是:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    fn [a]&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    {&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        return *(a, 2);&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这段代码返回一个具有一个参数的函数, 函数的功能是计算参数乘2的结果。这个函数还没有名字, 你可以把此函数赋值给别的符号:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    set(times-two, fn [a] {return *(a, 2)})&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们现在可以这样调用这个函数:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    time-two(5)         // 返回10&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们先跳过符号和函数, 讲一讲表。什么是表? 你也许已经听过好多相关的说法。表, 一言以蔽之, 就是把类似XML那样的数据块, 用s表达式来表示。表用一对括号括住, 表中元素以空格分隔, 表可以嵌套。例如(这回我们用真正的Lisp语法, 注意用分号表示注释):&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    ()                      ; 空表&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (1)                     ; 含一个元素的表&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (1 "test")              ; 两元素表, 一个元素是整数1, 另一个是字符串&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (test "hello")          ; 两元素表, 一个元素是符号, 另一个是字符串&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (test (1 2) "hello")    ; 三元素表, 一个符号test, 一个含有两个元素1和2的&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;                            ; 表, 最后一个元素是字符串&lt;/p&gt;&lt;p&gt;&lt;br /&gt;当Lisp系统遇到这样的表时, 它所做的, 和Ant处理XML数据所做的, 非常相似, 那就是试图执行它们。其实, Lisp源码就是特定的一种表, 好比Ant源码是一种特定的XML一样。Lisp执行表的顺序是这样的, 表的第一个元素当作函数, 其他元素当作函数的参数。如果其中某个参数也是表, 那就按照同样的原则对这个表求值, 结果再传递给最初的函数作为参数。这就是基本原则。我们看一下真正的代码:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    (* 3 4)                 ; 相当于前面列举过的伪码*(3,4), 即计算3乘4&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (times-two 5)           ; 返回10, times-two按照前面的定义是求参数的2倍&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (3 4)                   ; 错误, 3不是函数&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (time-two)              ; 错误, times-two要求一个参数&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (times-two 3 4)         ; 错误, times-two只要求一个参数&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (set + -)               ; 把减法函数赋予符号+&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (+ 5 4)                 ; 依据上一句的结果, 此时+表示减法, 所以返回1&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (* 3 (+ 2 2))           ; 2+2的结果是4, 再乘3, 结果是12&lt;/p&gt;&lt;p&gt; 上述的例子中, 所有的表都是当作代码来处理的。怎样把表当作数据来处理呢? 同样的,设想一下, Ant是把XML数据当作自己的参数。在Lisp中, 我们给表加一个前缀'来表示数据。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    (set test '(1 2))       ; test的值为两元素表&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (set test (1 2))        ; 错误, 1不是函数&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (set test '(* 3 4))     ; test的值是三元素表, 三个元素分别是*, 3, 4&lt;/p&gt;&lt;p&gt; 我们可以用一个内置的函数head来返回表的第一个元素, tail函数来返回剩余元素组成的表。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    (head '(* 3 4))         ; 返回符号*&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (tail '(* 3 4))         ; 返回表(3 4)&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (head (tal '(* 3 4)))   ; 返回3&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    (head test)             ; 返回*&lt;/p&gt;&lt;p&gt;&lt;br /&gt;你可以把Lisp的内置函数想像成Ant的任务。差别在于, 我们不用在另外的语言中扩展Lisp(虽然完全可以做得到), 我们可以用Lisp自己来扩展自己, 就像上面举的times-two函数的例子。Lisp的内置函数集十分精简, 只包含了十分必要的部分。剩下的函数都是作为标准库来实现的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;Lisp宏&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;我们已经看到, 元编程在一个类似jsp的模板引擎方面的应用。我们通过简单的字符串处理来生成代码。但是我们可以做的更好。我们先提一个问题, 怎样写一个工具, 通过查找目录结构中的源文件来自动生成Ant脚本。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;用字符串处理的方式生成Ant脚本是一种简单的方式。当然, 还有一种更加抽象, 表达能力更强, 扩展性更好的方式, 就是利用XML库在内存中直接生成XML节点, 这样的话内存中的节点就可以自动序列化成为字符串。不仅如此, 我们的工具还可以分析这些节点, 对已有的XML文件做变换。通过直接处理XML节点。我们可以超越字符串处理, 使用更高层次的概念, 因此我们的工作就会做的更快更好。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们当然可以直接用Ant自身来处理XML变换和制作代码生成工具。或者我们也可以用Lisp来做这项工作。正像我们以前所知的, 表是Lisp内置的数据结构, Lisp含有大量的工具来快速有效的操作表(head和tail是最简单的两个)。而且, Lisp没有语义约束, 你可以构造任何数据结构, 只要你原意。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Lisp通过宏(macro)来做元编程。我们写一组宏来把任务列表(to-do list)转换为专用领域语言。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;回想一下上面to-do list的例子, 其XML的数据格式是这样的:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    &amp;lt;todo name = "housework"&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;item priority = "high"&amp;gt;Clean the hose&amp;lt;/item&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;item priority = "medium"&amp;gt;Wash the dishes&amp;lt;/item&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        &amp;lt;item priority = "medium"&amp;gt;Buy more soap&amp;lt;/item&amp;gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;    &amp;lt;/todo&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;相应的s表达式是这样的:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    (todo "housework"&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        (item (priority high) "Clean the house")&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        (item (priority medium) "Wash the dishes")&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        (item (priority medium) "Buy more soap"))&lt;/p&gt;&lt;p&gt;&lt;br /&gt;假设我们要写一个任务表的管理程序, 把任务表数据存到一组文件里, 当程序启动时, 从文件读取这些数据并显示给用户。在别的语言里(比如说Java), 这个任务该怎么做? 我们会解析XML文件, 从中得出任务表数据, 然后写代码遍历XML树, 再转换为Java的数据结构(老实讲, 在Java里解析XML真不是件轻松的事情), 最后再把数据展示给用户。现在如果用Lisp, 该怎么做?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;假定要用同样思路的化, 我们大概会用Lisp库来解析XML。XML对我们来说就是一个Lisp的表(s表达式), 我们可以遍历这个表, 然后把相关数据提交给用户。可是, 既然我们用Lisp, 就根本没有必要再用XML格式保存数据, 直接用s表达式就好了, 这样就没有必要做转换了。我们也用不着专门的解析库, Lisp可以直接在内存里处理s表达式。注意, Lisp编译器和.net编译器一样, 对Lisp程序来说, 在运行时总是随时可用的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;但是还有更好的办法。我们甚至不用写表达式来存储数据, 我们可以写宏, 把数据当作代码来处理。那该怎么做呢? 真的简单。回想一下, Lisp的函数调用格式:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    (function-name arg1 arg2 arg3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;其中每个参数都是s表达式, 求值以后, 传递给函数。如果我们用(+ 4 5)来代替arg1,那么, 程序会先求出结果, 就是9, 然后把9传递给函数。宏的工作方式和函数类似。主要的差别是, 宏的参数在代入时不求值。&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    (macro-name (+ 4 5))&lt;/p&gt;&lt;p&gt; 这里, (+ 4 5)作为一个表传递给宏, 然后宏就可以任意处理这个表, 当然也可以对它求值。宏的返回值是一个表, 然后有程序作为代码来执行。宏所占的位置, 就被替换为这个结果代码。我们可以定义一个宏把数据替换为任意代码, 比方说, 替换为显示数据给用户的代码。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;这和元编程, 以及我们要做的任务表程序有什么关系呢? 实际上, 编译器会替我们工作,调用相应的宏。我们所要做的, 仅仅是创建一个把数据转换为适当代码的宏。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;例如, 上面曾经将过的C的求三次方的宏, 用Lisp来写是这样子:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;    (defmacro triple (x)&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        `(+ ~x ~x ~x))&lt;/p&gt;&lt;p&gt;&lt;br /&gt;(译注: 在Common Lisp中, 此处的单引号应当是反单引号, 意思是对表不求值, 但可以对表中某元素求值, 记号~表示对元素x求值, 这个求值记号在Common Lisp中应当是逗号。反单引号和单引号的区别是, 单引号标识的表, 其中的元素都不求值。这里作者所用的记号是自己发明的一种Lisp方言Blaise, 和common lisp略有不同, 事实上, 发明方言是lisp高手独有的乐趣, 很多狂热分子都热衷这样做。比如Paul Graham就发明了ARC, 许多记号比传统的Lisp简洁得多, 显得比较现代)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;单引号的用处是禁止对表求值。每次程序中出现triple的时候, &lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    (triple 4)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;都会被替换成:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    (+ 4 4 4)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们可以为任务表程序写一个宏, 把任务数据转换为可执行码, 然后执行。假定我们的输出是在控制台:&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;&lt;br /&gt;    (defmacro item (priority note)&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;        `(block &lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;            (print stdout tab "Prority: " ~(head (tail priority)) endl)&lt;/p&gt;&lt;p style="font-family: Courier New;"&gt;            (print stdout tab "Note: " ~note endl endl)))&lt;/p&gt;&lt;p&gt; 我们创造了一个非常小的有限的语言来管理嵌在Lisp中的任务表。这个语言只用来解决特定领域的问题, 通常称之为DSLs(特定领域语言, 或专用领域语言)。&lt;/p&gt;&lt;h1&gt;特定领域语言&lt;/h1&gt;&lt;p&gt;本文谈到了两个特定领域语言, 一个是Ant, 处理软件构造。一个是没起名字的, 用于处理任务表。两者的差别在于, Ant是用XML, XML解析器, 以及Java语言合在一起构造出来的。而我们的迷你语言则完全内嵌在Lisp中, 只消几分钟就做出来了。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们已经说过了DSL的好处, 这也就是Ant用XML而不直接用Java的原因。如果使用Lisp,我们可以任意创建DSL, 只要我们需要。我们可以创建用于网站程序的DSL, 可以写多用户游戏, 做固定收益贸易(fixed income trade), 解决蛋白质折叠问题, 处理事务问题, 等等。我们可以把这些叠放在一起, 造出一个语言, 专门解决基于网络的贸易程序, 既有网络语言的优势, 又有贸易语言的好处。每天我们都会收获这种方法带给我们的益处, 远远超过Ant所能给予我们的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;用DSL解决问题, 做出的程序精简, 易于维护, 富有弹性。在Java里面, 我们可以用类来处理问题。这两种方法的差别在于, Lisp使我们达到了一个更高层次的抽象, 我们不再受语言解析器本身的限制, 比较一下用Java库直接写的构造脚本和用Ant写的构造脚本其间的差别。同样的, 比较一下你以前所做的工作, 你就会明白Lisp带来的好处。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h1&gt;接下来&lt;/h1&gt;&lt;p&gt;学习Lisp就像战争中争夺山头。尽管在电脑科学领域, Lisp已经算是一门古老的语言, 直到现在仍然很少有人真的明白该怎样给初学者讲授Lisp。尽管Lisp老手们尽了很大努力,今天新手学习Lisp仍然是困难重重。好在现在事情正在发生变化, Lisp的资源正在迅速增加, 随着时间推移, Lisp将会越来越受关注。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Lisp使人超越平庸, 走到前沿。学会Lisp意味着你能找到更好的工作, 因为聪明的雇主会被你与众不同的洞察力所打动。学会Lisp也可能意味着明天你可能会被解雇, 因为你总是强调, 如果公司所有软件都用Lisp写, 公司将会如何卓越, 而这些话你的同事会听烦的。Lisp值得努力学习吗? 那些已经学会Lisp的人都说值得, 当然, 这取决于你的判断。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;你的看法呢?&lt;br /&gt;&lt;/h1&gt;&lt;p&gt;这篇文章写写停停, 用了几个月才最终完成。如果你觉得有趣, 或者有什么问题, 意见或建议, 请给我发邮件coffeemug@gmail.com, 我会很高兴收到你的反馈。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-2494236478299967829?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/2494236478299967829/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=2494236478299967829&amp;isPopup=true' title='34 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2494236478299967829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2494236478299967829'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/10/lispthe-nature-of-lisp.html' title='[转贴]Lisp的本质(The Nature of Lisp)'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-2164092297507209427</id><published>2009-09-03T08:33:00.001-07:00</published><updated>2009-09-03T08:33:39.068-07:00</updated><title type='text'>OpenERP ODT 报表测试结果</title><content type='html'>&lt;p&gt;今晚经过我的测试，证实了 OpenERP 的确支持直接 odt to odt 报表模板的转换，但是还是存在不少问题：&lt;br&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;添加 odt 的模板也要继承用 python 代码进行注册，比较麻烦。  &lt;/li&gt;&lt;li&gt;openerp/server/bin/report/report_sxw.py 的 .ODT 转化代码存在 bug，请在创建 odt 模板时把 odt 文档的"属性"中的 &amp;quot;Info 3&amp;quot;, &amp;quot;Info 4&amp;quot; 之类的"自定义属性"删掉（参考图1），否则会引发异常。 &lt;/li&gt;&lt;li&gt;OpenERP 会自作多情地更改样式表，导致转换前后效果不一。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;br&gt;&lt;a href="https://e3y41w.bay.livefilestore.com/y1mBuoY20vO2iyEsu0sLGRmFHsAC-x08J6zRSqPmGFSjedknPj_jKX3wr_KCpk_0kCAwJN6uaNL5udG1TaWGHxw0Uj0VIGmmhjLGruBJP5CZ-sSUPcy6mCBJsY4xikhx0a4KKBnqfU1yGvq6ef4DNwInw/image%5B5%5D.png" rel="WLPP"&gt;&lt;img style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="https://e3y41w.bay.livefilestore.com/y1mAFOn75actKb7l0ojkP4m2G6Mx4NFYmjXZ4yHz5RGfAtA3Hgu50hbMPNc-gfyLiB5vhFn8RLPYlnomulwwHjnz05SEMeZCw6FxtiwF9YcnoyeYQk1fn3DqDNcq4xOtLS0dUk9FOoF58tlDJuIBt596Q/image_thumb%5B1%5D.png" border="0" height="190" width="244"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;图1：OpenOffice Writer 的"属性"对话框&lt;/p&gt; &lt;p&gt;附 带的 "partner_odt_report"是一个ODT 模板测试模块，演示如何创建 ODT 模板。可以通过 OpenERP 自带的模块导入 partner_odt.report.zip 文件，模块安装完成之后在 Partner 的表单右侧即可看到 "Partner ODT" 的报表按钮。&lt;/p&gt; &lt;p&gt;&lt;a href="https://e3y41w.bay.livefilestore.com/y1mGPcJLfOH9TcKlbhRP6lNlA1Tuxkn01VsFRHy7PELeSI-Zbx_Y4pUCrzkASy5KUV3VoUpYWBjz2NsTdWuH6EKrqa5Ztmvv8JLguEX8Dz-hL6diwFhcE8Q-mzuhAUIaY4Y8I-4KE8plKWZQbxqgOwSqQ/image%5B2%5D.png" rel="WLPP"&gt;&lt;img style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" alt="image" src="https://e3y41w.bay.livefilestore.com/y1mAN9x0bSb4RqWZlp6aD3WgEKoaXccXhrC1L8m19M1LGX2ee4qOAprl4S58ZTOx6hErJu7_0Os_Rs3frd5vlesl_rLk6d9iiYGaee_duFR70tBXhRy9ptMKt9NtBZnamJmcuG1inV1sAxy9WueT9mSQQ/image_thumb.png" border="0" height="207" width="244"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;图2：Partner 表单&lt;/p&gt; &lt;p&gt;测试模块下载：&lt;a href="http://cid-218708052a8413fb.skydrive.live.com/self.aspx/.Public/partner%7C_report%7C_odt.zip"&gt;partner_odt_report.zip&lt;/a&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-2164092297507209427?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/2164092297507209427/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=2164092297507209427&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2164092297507209427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2164092297507209427'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/09/openerp-odt.html' title='OpenERP ODT 报表测试结果'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-6910288478829787531</id><published>2009-07-11T05:51:00.001-07:00</published><updated>2009-07-11T05:51:17.442-07:00</updated><title type='text'></title><content type='html'>email publishing test&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-6910288478829787531?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/6910288478829787531/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=6910288478829787531&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/6910288478829787531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/6910288478829787531'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/07/email-publishing-test.html' title=''/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-6847452335579620699</id><published>2009-05-12T08:12:00.000-07:00</published><updated>2009-05-12T08:19:34.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenERP'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>eTiny（OpenERP Web客户端）大重构</title><content type='html'>今天从 OpenERP 的官方博客看到，OpenERP 团队已经对 trunk 中的 OpenERP Web 客户端——eTiny 进行了巨大的重构。&lt;br /&gt;&lt;br /&gt;eTiny 如今不再需要整套 TurboGears 框架，而是成为了一个简单的、真正的 Web前台，仅仅使用 CherryPy3 来提供 HTTP 服务，这样不仅速度大大提升，据说是达到了3~5倍，也简化了部署过程，免去了频繁升级、依赖巨多的 TurboGears。&lt;br /&gt;&lt;br /&gt;此次升级功能上已经基本迁移完成，不过在发文时 eTiny 的 win32/setup.py 安装脚本仍然没有同步更新，应该是开发团队的一个小小疏漏，还是让我们期待下一个发布版带来稳定、高效的 eTiny 吧。&lt;br /&gt;&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-6847452335579620699?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/6847452335579620699/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=6847452335579620699&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/6847452335579620699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/6847452335579620699'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/05/etinyopenerp-web.html' title='eTiny（OpenERP Web客户端）大重构'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-3309739750396935053</id><published>2009-05-09T07:31:00.000-07:00</published><updated>2009-05-09T07:46:22.138-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenERP'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>OpenERP 创建的公路货运管理系统原型</title><content type='html'>我现在基本上可以用 OpenERP 进行业务不太复杂的开发了，先截几个界面图玩玩：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;GTK+ 客户端：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CG0kNA3vehM/SgWWRNy9XEI/AAAAAAAAAVk/YJxzaJfyYts/s1600-h/1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 289px;" src="http://1.bp.blogspot.com/_CG0kNA3vehM/SgWWRNy9XEI/AAAAAAAAAVk/YJxzaJfyYts/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5333834556195560514" border="0" /&gt;&lt;/a&gt;&lt;img src="file:///C:/DOCUME%7E1/oldrev/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CG0kNA3vehM/SgWWk7I5hiI/AAAAAAAAAVs/559z0TTC7ys/s1600-h/2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 289px;" src="http://4.bp.blogspot.com/_CG0kNA3vehM/SgWWk7I5hiI/AAAAAAAAAVs/559z0TTC7ys/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5333834894784693794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CG0kNA3vehM/SgWWsGmeXKI/AAAAAAAAAV0/aIvvVPNAiZw/s1600-h/3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 289px;" src="http://2.bp.blogspot.com/_CG0kNA3vehM/SgWWsGmeXKI/AAAAAAAAAV0/aIvvVPNAiZw/s400/3.png" alt="" id="BLOGGER_PHOTO_ID_5333835018120617122" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CG0kNA3vehM/SgWWy9nNHpI/AAAAAAAAAV8/zbN5o21Ndqg/s1600-h/4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 289px;" src="http://4.bp.blogspot.com/_CG0kNA3vehM/SgWWy9nNHpI/AAAAAAAAAV8/zbN5o21Ndqg/s400/4.png" alt="" id="BLOGGER_PHOTO_ID_5333835135966846610" border="0" /&gt;&lt;/a&gt;再来两个 Web 的：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CG0kNA3vehM/SgWW4-E-qUI/AAAAAAAAAWE/wKhPb6fKjoA/s1600-h/5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://1.bp.blogspot.com/_CG0kNA3vehM/SgWW4-E-qUI/AAAAAAAAAWE/wKhPb6fKjoA/s400/5.png" alt="" id="BLOGGER_PHOTO_ID_5333835239170943298" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CG0kNA3vehM/SgWW-e7EgHI/AAAAAAAAAWM/7n7h6CwakoA/s1600-h/6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://1.bp.blogspot.com/_CG0kNA3vehM/SgWW-e7EgHI/AAAAAAAAAWM/7n7h6CwakoA/s400/6.png" alt="" id="BLOGGER_PHOTO_ID_5333835333887098994" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-3309739750396935053?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/3309739750396935053/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=3309739750396935053&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3309739750396935053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3309739750396935053'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/05/openerp.html' title='OpenERP 创建的公路货运管理系统原型'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CG0kNA3vehM/SgWWRNy9XEI/AAAAAAAAAVk/YJxzaJfyYts/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-3335378262116354775</id><published>2009-04-18T02:36:00.000-07:00</published><updated>2009-04-18T02:56:45.823-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python PuLP 线性规划库求解“鸡兔同笼”问题</title><content type='html'>PuLP 是一个 Python 的线性规划库，使用起来相当的简单方便：&lt;br /&gt;&lt;a href="http://code.google.com/p/pulp-or/"&gt;http://code.google.com/p/pulp-or/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;“鸡兔同笼”是我国隋朝时期的数学著作《孙子算经》中的一个有趣而具有深远影响的题目：“今有雉兔同笼，上有三十五头，下有九十四足.问雉兔各几何.”&lt;br /&gt;&lt;br /&gt;这里我们用 PuLP 来描述“鸡兔同笼”，设鸡的数量为 x，兔子的数量为 y，求解：&lt;br /&gt;&lt;br /&gt;&lt;div class="source"  style="font-family:monospace;"&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;pulp&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;prob&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;LpProblem&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"test"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;LpMinimize&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;x&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;LpVariable&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"x"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;None&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;LpInteger&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;y&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;LpVariable&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"y"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;None&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;LpInteger&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;prob&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;+=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;x&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;y&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;35&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;prob&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;+=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;2&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;x&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;4&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;y&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;94&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;prob&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;solve&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 0);"&gt;GLPK&lt;/span&gt;())&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;for&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;v&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;prob&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;variables&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;():&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    print&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;v&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(163, 21, 21);"&gt;"="&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;v&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;varValue&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;结果：&lt;br /&gt;x = 23&lt;br /&gt;y = 12&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-3335378262116354775?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/3335378262116354775/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=3335378262116354775&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3335378262116354775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3335378262116354775'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/04/python-pulp.html' title='Python PuLP 线性规划库求解“鸡兔同笼”问题'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-8205296906514708581</id><published>2009-04-03T07:46:00.000-07:00</published><updated>2009-04-03T07:50:14.291-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenERP'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='通告'/><title type='text'>OpenERP PDF 报表中文支持模块：base_report_cn</title><content type='html'>&lt;div id="postmessage_1880" class="t_msgfont"&gt;此&lt;span href="http://www.shine-it.net/tag.php?name=%C4%A3%BF%E9" onclick="tagshow(event)" class="t_tag"&gt;模块&lt;/span&gt;是基于 &lt;a href="http://exploringopenerp.blogspot.com/2009/04/new-module-basereportunicode.html"&gt;Gábor Dukai&lt;/a&gt; 编写的 base_report_unicode 模块修改而来，自带了开源的文泉驿正黑体和 AR PL SungtiL GB 宋体。该模块的使用非常简单，只需要直接导入这个模块，不需要任何的 hack，Open&lt;span href="http://www.shine-it.net/tag.php?name=ERP" onclick="tagshow(event)" class="t_tag"&gt;ERP&lt;/span&gt; 现存的报表即可直接支持中文。当然了，内置报表的现存的文字仍然是英文的，本模块只是提供中文支持，让中文别显示成方框。&lt;br /&gt;&lt;br /&gt;下载：&lt;br /&gt;&lt;a href="http://openerp-community-addons.googlecode.com/files/base_report_cn.zip" target="_blank"&gt;http://openerp-community-addons.googlecode.com/files/base_report_cn.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;项目主页：&lt;br /&gt;&lt;a href="http://code.google.com/p/openerp-community-addons" target="_blank"&gt;http://code.google.com/p/openerp-community-addons&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-8205296906514708581?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/8205296906514708581/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=8205296906514708581&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8205296906514708581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8205296906514708581'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/04/openerp-pdf-basereportcn.html' title='OpenERP PDF 报表中文支持模块：base_report_cn'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-7731760565535397501</id><published>2009-04-01T05:06:00.000-07:00</published><updated>2009-04-01T05:11:18.114-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'></title><content type='html'>DMD D语言编译器 1.042 &amp;amp; 2.027 放出！&lt;br /&gt;其中，2.027 添加了超酷的 "alias this" 特性，可以简单地理解为C++的自定义类型转换操作符增强版，有了这个特性可以完全实现像 .Net 一样用 struct 封装内置类型。官网上的范例如下：&lt;br /&gt;&lt;br /&gt;&lt;ol class="dp-c" start="1"&gt;&lt;blockquote&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;&lt;span class="keyword"&gt;struct&lt;/span&gt;&lt;span&gt; Int32  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;{   &lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; x;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    alias x &lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; foo(&lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; i) { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; i * 2; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; test()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    Int32 s;  &lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    s.x = 7;  &lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; i = -s;   &lt;/span&gt;&lt;span class="comment"&gt;// i == -7&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    i = s + 8;    &lt;span class="comment"&gt;// i == 15&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    i = s + s;    &lt;span class="comment"&gt;// i == 14&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    i = 9 + s;    &lt;span class="comment"&gt;// i == 16&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;&lt;span&gt;    i = foo(s);   &lt;span class="comment"&gt;// implicit conversion to int&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-family: courier new;"&gt;}  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/blockquote&gt;&lt;/ol&gt;还是等我有空翻翻 More Effective C++，重温一下那些 C++ 自定义操作符重载的条款再说。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-7731760565535397501?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/7731760565535397501/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=7731760565535397501&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7731760565535397501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7731760565535397501'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/04/dmd-d-1.html' title=''/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-9009306274596200748</id><published>2009-03-22T06:07:00.000-07:00</published><updated>2009-03-25T08:50:26.816-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><category scheme='http://www.blogger.com/atom/ns#' term='Windump'/><title type='text'>我的又一 D 开源项目——WindumpWindump</title><content type='html'>&lt;div id="wikicontent" style="padding: 0pt 3em 1.2em 0pt;"&gt;  &lt;p&gt;官网介绍：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;a name="是什么"&gt;&lt;/a&gt;&lt;blockquote&gt;WindumpWindump（没错，名字就是 WindumpWindump，这么好的名字应该重复两次） 是这个星球上功能最强的密码恢复程序，能够读取如下软件保存的密码： &lt;ul&gt;&lt;li&gt;Internet Explorer 6/7/8 的自动完成和密码保护站点 &lt;/li&gt;&lt;li&gt;WindowsLive&lt;a href="http://code.google.com/p/windump/w/edit/WindowsLive"&gt;&lt;/a&gt;/MSN Messenger 7/8/8.1 已保存的密码（不支持 Windows 2000） &lt;/li&gt;&lt;li&gt;Internet Explorer 网页文本框扫描 &lt;/li&gt;&lt;li&gt;Firefox 1/1.5/2/3 自动完成密码 &lt;/li&gt;&lt;li&gt;ThunderBird 1/1.5/2 邮件帐号密码 &lt;/li&gt;&lt;li&gt;Outlook2000/2003/2007 邮件帐号密码 &lt;/li&gt;&lt;li&gt;OutlookExpress 邮件帐号密码 &lt;/li&gt;&lt;li&gt;Windows LSA 扫描，包括所有保存的 ADSL 帐号密码和Windows 默认登陆密码 &lt;/li&gt;&lt;li&gt;Eudora 7 电子邮件客户端保存的帐号密码 &lt;/li&gt;&lt;li&gt;贸易通（阿里旺旺贸易通版5.1/TradeManager2）通讯工具保存的所有帐号密码 &lt;/li&gt;&lt;li&gt;Foxmail 5/6 所有保存的帐号密码 &lt;/li&gt;&lt;li&gt;Becky! 电子邮件客户端帐号密码 &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;/ul&gt;项目主页：&lt;br /&gt;&lt;a href="http://code.google.com/p/windump/"&gt;http://code.google.com/p/windump/ &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;可执行文件下载：&lt;br /&gt;&lt;a href="http://windump.googlecode.com/files/windump.zip" target="_blank"&gt;http://windump.googlecode.com/files/windump.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;可执行文件用 upx 压缩过，如果杀毒软件误报是正常现象。       &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-9009306274596200748?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/9009306274596200748/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=9009306274596200748&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/9009306274596200748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/9009306274596200748'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/03/d-windump.html' title='我的又一 D 开源项目——WindumpWindump'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-302324119228742041</id><published>2009-03-20T07:15:00.000-07:00</published><updated>2009-03-20T07:20:03.571-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Ruby On Rails 升级到 2.3.2</title><content type='html'>Ruby On Rails 已经发布了稳定版本 2.3.2，但是以前的程序在 2.3 下运行时会出现如：&lt;br /&gt;&lt;blockquote&gt;uninitialized constant ApplicationController&lt;/blockquote&gt;这样的错误，解决该问题只需运行：&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;rake rails:update&lt;/span&gt;&lt;br /&gt;即可，该任务会把 app/controller/application.rb 改名为 application_controller.rb，酱紫似乎也更符合 Rails 的命名习惯。&lt;br /&gt;据说 Rails 2.3.2 还支持 Ruby 1.9，不过这得等什么时候有时间才能试试看了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-302324119228742041?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/302324119228742041/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=302324119228742041&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/302324119228742041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/302324119228742041'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/03/ruby-on-rails-232.html' title='Ruby On Rails 升级到 2.3.2'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-2751717872676937255</id><published>2009-03-03T19:30:00.000-08:00</published><updated>2009-03-07T04:48:19.306-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenERP'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>无耻地修改 OpenERP 的 Web 客户端界面</title><content type='html'>我很无耻地把 OpenERP 的 Web 客户端界面改成了酱紫：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CG0kNA3vehM/SbJs6w0UGjI/AAAAAAAAANo/Nnh1U6Rxz5s/s1600-h/Screenshot-%E8%8F%9C%E5%8D%95+-+Mozilla+Firefox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 290px;" src="http://4.bp.blogspot.com/_CG0kNA3vehM/SbJs6w0UGjI/AAAAAAAAANo/Nnh1U6Rxz5s/s400/Screenshot-%E8%8F%9C%E5%8D%95+-+Mozilla+Firefox.png" alt="" id="BLOGGER_PHOTO_ID_5310426667415771698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;违反了 OpenERP Web 客户端的许可协议哦，无耻吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-2751717872676937255?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/2751717872676937255/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=2751717872676937255&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2751717872676937255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2751717872676937255'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/03/openerp-web.html' title='无耻地修改 OpenERP 的 Web 客户端界面'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CG0kNA3vehM/SbJs6w0UGjI/AAAAAAAAANo/Nnh1U6Rxz5s/s72-c/Screenshot-%E8%8F%9C%E5%8D%95+-+Mozilla+Firefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-8916252590357132322</id><published>2009-03-03T19:19:00.000-08:00</published><updated>2009-03-03T19:21:22.226-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非技术'/><category scheme='http://www.blogger.com/atom/ns#' term='黑色幽默'/><title type='text'>《解放日报》解释“卧槽泥马”</title><content type='html'>来源：&lt;a href="http://epaper.jfdaily.com/jfdaily/html/2009-02/23/content_199104.htm"&gt;http://epaper.jfdaily.com/jfdaily/html/2009-02/23/content_199104.htm&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;“卧槽”是怎么回事&lt;br /&gt;&lt;span style="line-height: 30px;font-size:14;" &gt;&lt;/span&gt;    &lt;div class="jf_paper_black_txt" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;       2009-02-23   &lt;/span&gt; &lt;span style="color: rgb(1, 64, 169);"&gt;     &lt;strong&gt;  10版：新论  &lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;  &lt;hr noshade="noshade"  style="font-size:78%;"&gt;      &lt;span class="px12"&gt;  &lt;br /&gt;&lt;input value="0" name="titlecheckbox" sourceid="" style="display: none;" type="checkbox"&gt; &lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  style="padding: 0px 30px 0px 10px; line-height: 21px;font-size:14px;" align="left"&gt;&lt;div id="ozoom" style=""&gt;&lt;span style="font-size:78%;"&gt;&lt;founder-content&gt;&lt;/founder-content&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　主持人：百科小子&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　提问者：丁莹（上海南京西路）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　解答者：段凡（华东理工大学社会与公共管理学院博士）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　问：日前有一项调查显示，26.3%的人表示因为金融危机推迟了跳槽计划；近七成白领决定做好手头工作，老老实实地“卧槽”。请问，卧槽具体是什么意思？如何做一个不虚有其表的“卧槽者”？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　答：良禽择木而栖、“良马择槽而卧”，是社会流动的必然趋势，也是职场人士依据市场规律进行人力资源配置的方式。不过，如何“跳”，怎么“卧”，能否“一马当先”抑或“马失前蹄”，值得细细思量。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　 　跳槽，本是旧上海的一句俗话，曾频繁出现在清末小说《海上花列传》中。现在，它的引申义是指职员自愿主动地请求辞职。卧槽一词，本为中国象棋里的一杀 招，指的是进到底象前一格位置的马，既可将军，又可抽车，极其凶狠。但在职场语境中，它显然与“跳槽”相对应，指的是把握市场走向，司职分内工作，拒绝轻 率跳槽，精于韬光养晦的行为。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　　不过，卧槽与跳槽并非完全对立，否则就可能变成一匹“卧 槽泥马”。卧槽泥马出自《战国策》，形容虚有其表、窃居名位者，即使有相应的地位，其能力也不足以胜任，等同于烂泥扶不上墙。所以说，卧槽者不应成为“卧 槽泥马”，卧槽也并非“卧以待毙”。职场人士大可不必草木皆兵，而要变被动为主动，视卧槽为蓄势待发、开创工作新局面的机会。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;　 　要不虚有其表地卧槽，有必要牢记以下两点准则：一是遵守职场规则，不要做一天和尚撞一天钟，而应在本职岗位上更加勤奋努力，以此来避免被动失业；二是找 准定位，厘清自身职业目标和规划，在沉下心来做好本职工作的同时，积极补充和更新知识和技能，以便在经济复苏和职场回暖后成为一匹“骏马”。&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;span class="px12"&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td  style="padding: 0px 30px 0px 10px; line-height: 21px;font-size:14px;" align="left"&gt;&lt;div id="ozoom" style=""&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="px12"&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-8916252590357132322?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/8916252590357132322/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=8916252590357132322&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8916252590357132322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8916252590357132322'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2009/03/blog-post.html' title='《解放日报》解释“卧槽泥马”'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-910884138647562570</id><published>2008-12-05T20:41:00.000-08:00</published><updated>2008-12-05T20:42:50.484-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非技术'/><title type='text'>Yesterday ， we lost a hero</title><content type='html'>&lt;blockquote&gt;Yesterday ， we lost a hero ， but there must be more heros in the future！They stand out and say no ， by their actions！ We can lost our lives ， we can lost our freedom ， we can lost everything important to us ！ But we can not lost our faith of dignity ！ Never ever again ！&lt;/blockquote&gt;FROM: &lt;a href="http://163follow.blog.163.com/blog/static/311484352008102722942700/"&gt;http://163follow.blog.163.com/blog/static/311484352008102722942700/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-910884138647562570?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/910884138647562570/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=910884138647562570&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/910884138647562570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/910884138647562570'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/12/yesterday-we-lost-hero-but-there-must.html' title='Yesterday ， we lost a hero'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-9156321455846080573</id><published>2008-11-21T04:51:00.000-08:00</published><updated>2008-11-21T04:53:40.243-08:00</updated><title type='text'>网民们是真正的英雄，而我们自己往往是幼稚可笑的 II</title><content type='html'>&lt;div class="EntryTitle"&gt;                     &lt;span id="ctl00_Main_EntryForm_TitleLink" class="ContextMenuTarget"&gt;“中石油中石化绝密私家电路”&lt;/span&gt;                 &lt;/div&gt;                                                   &lt;div class="EntryTools"&gt;                     &lt;a&gt;                         老卡                         @&lt;/a&gt; &lt;a&gt;                             2008-11-21 9:48:50                     &lt;/a&gt;                     &lt;a&gt;                             阅读(392)                         &lt;/a&gt;                     &lt;a id="ctl00_Main_EntryForm_HyperLink2"&gt;评论(1)&lt;/a&gt;                     &lt;a id="ctl00_Main_EntryForm_HyperLink1" href="http://www.bullog.cn/blogs/laoka/trackbacks/220593.aspx" target="_blank"&gt;        引用通告&lt;/a&gt;                     &lt;a href="http://www.bullog.cn/blogs/laoka/?cat="&gt;                         分类:                         未归类&lt;/a&gt;                 &lt;/div&gt;                 &lt;div class="EntryBody"&gt;                  &lt;div class="diggbar"&gt;     &lt;div class="diggs"&gt;         &lt;span id="ctl00_Main_EntryForm_DiggBar1_DiggsLabel" style="color: rgb(154, 205, 50);"&gt;2&lt;/span&gt;     &lt;/div&gt;     &lt;div class="digg-buttons"&gt;              &lt;/div&gt; &lt;/div&gt;                      &lt;p&gt;&lt;span style="font-size: 13px;"&gt;下面的电路被命名为“中石油中石化绝密私家电路”.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 13px;"&gt;画出这个电路的人有可能是用电路来描述社会现象的开山鼻祖.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 13px;"&gt;这个电路的说明和特点如下:&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 13px;"&gt;1 电容C1是个1万微法的电容,容量很大.它的电压表示中石油中石化的油价.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 13px;"&gt;2 当国际油价上涨时,电容的电压(中石油中石化的油价)则涨得非常快,因为它是通过二极管D1单向导通充电的,这叫做与国际接轨吧.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 13px;"&gt;3 当国际油价(电源电压)下跌,低于国内油价(电容电压)时,二极管反向截止,电容C1只能通过一个10MΩ的大电阻R1放电,电压下降很是缓慢,加之电容很大,放电有时间常数对于电路来说是非常非常大的.这时就很难与国际接轨了.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 13px;"&gt;&lt;img src="http://www.bullog.cn/blogs/laoka/files/51501226318031.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 13px;"&gt;&lt;a href="http://money.163.com/08/1121/07/4R8NG53K00251LIE.html"&gt;国际油价跌破50美元&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 13px;"&gt;&lt;a href="http://money.163.com/08/1121/07/4R8NG53K00251LIE.html"&gt;from http://www.bullog.cn/blogs/laoka/archives/220593.aspx&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;                 &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-9156321455846080573?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/9156321455846080573/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=9156321455846080573&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/9156321455846080573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/9156321455846080573'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/11/ii.html' title='网民们是真正的英雄，而我们自己往往是幼稚可笑的 II'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-2667325828912674816</id><published>2008-11-05T23:20:00.000-08:00</published><updated>2008-11-05T23:39:12.950-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非技术'/><title type='text'>小学作文：一件令我难忘的事</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.chinabreed.com/fishery/UploadPic/2007-2/200729141543351.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 118px;" src="http://www.chinabreed.com/fishery/UploadPic/2007-2/200729141543351.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;img src="file:///C:/DOCUME%7E1/LIWEI%7E1.2FD/LOCALS%7E1/Temp/moz-screenshot-1.jpg" alt="" /&gt;今天我到大观路上的省招标公司去办事，结果刚赶到那里人家就下班了，于是我吃了午饭就无聊地在大观河边上闲逛。&lt;br /&gt;&lt;br /&gt;突然我看见水边有一个像棍子一样的生物在蠕动，原来是一条鳝鱼！我就把旁边正在抓小鱼的红领巾叫了过来，在我的指导下，这位小同学不一会儿的功夫就抓到了好几条大鳝鱼。&lt;br /&gt;&lt;br /&gt;我就问他：“哇噢，你这么多鳝鱼可以拿去好好吓唬一下女同学啊！”&lt;br /&gt;&lt;br /&gt;红领巾答道：“靠，我玩玩就放了它们了。”&lt;br /&gt;&lt;br /&gt;听到这里，我为我自己的下流思想感到无地自容，恨不得跳到水里不浮上来。这时，红领巾的身影在我的眼中逐渐高大起来，在阳光的照射下，显得那么的耀眼。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-2667325828912674816?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/2667325828912674816/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=2667325828912674816&amp;isPopup=true' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2667325828912674816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2667325828912674816'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/11/blog-post.html' title='小学作文：一件令我难忘的事'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-4967062397863703965</id><published>2008-10-24T19:44:00.000-07:00</published><updated>2008-10-24T19:48:47.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='功夫网'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='黑色幽默'/><title type='text'>转载一黑色幽默：好消息， 国家支持Python的发展</title><content type='html'>&lt;script type="text/javascript"&gt;     Douban.prettify_form(document.getElementById('ssform'));     &lt;/script&gt;          &lt;div id="main"&gt;     &lt;div id="tablem"&gt;     &lt;div id="in_tablem"&gt;              &lt;table class="wr"&gt;&lt;tbody&gt;&lt;tr&gt;         &lt;td class="wrtd"&gt;&lt;a href="http://www.douban.com/people/1314003/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="main"&gt;&lt;div id="tablem"&gt;&lt;div id="in_tablem"&gt;&lt;table class="wr"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="wrtd"&gt;&lt;a href="http://www.douban.com/people/1314003/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div id="main"&gt;&lt;div id="tablem"&gt;&lt;div id="in_tablem"&gt;&lt;table class="wr"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="wrtd"&gt;&lt;a href="http://www.douban.com/people/1314003/"&gt;&lt;img class="pil" src="http://otho.douban.com/icon/u1314003-6.jpg" alt="yushih" /&gt;&lt;/a&gt;&lt;/td&gt;         &lt;td&gt;         &lt;span class="mn"&gt;2008-10-24 21:35:14&lt;/span&gt;         &lt;span class="pl2"&gt;　　来自: yushih         (成都)&lt;/span&gt;&lt;br /&gt;&lt;p class="wrc"&gt;　　为了打击Python的竞争对手Ruby，已经把ruby-doc.org封了，哈哈。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;Ruby 语言文档站在国内无法登陆，网友如是说。&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;来源：&lt;a href="http://www.douban.com/group/topic/4471772/"&gt;http://www.douban.com/group/topic/4471772/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-4967062397863703965?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/4967062397863703965/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=4967062397863703965&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4967062397863703965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4967062397863703965'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/10/python.html' title='转载一黑色幽默：好消息， 国家支持Python的发展'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-7254353122505124968</id><published>2008-10-20T22:02:00.000-07:00</published><updated>2008-10-24T19:27:51.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非技术'/><category scheme='http://www.blogger.com/atom/ns#' term='转载'/><title type='text'>新词古译</title><content type='html'>　　《老鼠爱大米》诗经体：&lt;br /&gt;&lt;blockquote&gt;　　吾闻君声，乃有异觉&lt;br /&gt;　　辗转思之，毋敢相忘&lt;br /&gt;　　君在我心，永难忘之&lt;br /&gt;　　若当其日，诸愿皆偿&lt;br /&gt;　　吾爱静女，上可鉴之&lt;br /&gt;　　途远且艰，吾可誓之：&lt;br /&gt;　　吾爱静女，如鼠嗜米&lt;br /&gt;　　风来雨打，永世同心&lt;br /&gt;　　君在我心，纵苦纵难&lt;br /&gt;　　惟愿君喜，九死无悔！&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　离骚体&lt;br /&gt;　　&lt;br /&gt;&lt;blockquote&gt;　　吾闻汝音兮，心有异异然。&lt;br /&gt;　　魂魄思之不反兮，忽忽何相忘。&lt;br /&gt;　　&lt;br /&gt;　　吾心有汝兮，从此永难离。&lt;br /&gt;　　如今唯思一念兮，又恐如何之。&lt;br /&gt;　　&lt;br /&gt;　　吾得汝配兮，变而山川震。&lt;br /&gt;　　纵路远而途难兮，上下求索之。&lt;br /&gt;　　&lt;br /&gt;　　吾心慕汝兮，如鼠梦想米。&lt;br /&gt;　　披凄风戴苦雨兮，然不离不弃。&lt;br /&gt;　　&lt;br /&gt;　　吾心念汝兮，黄连复蜜糖。&lt;br /&gt;　　得汝欢悦足以兮，废云鹤而纵。&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;《两只蝴蝶》：&lt;br /&gt;&lt;br /&gt;　　卿女徐翱，&lt;br /&gt;　　华有棘兮。&lt;br /&gt;　　卿女启口，&lt;br /&gt;　　风有芳兮。&lt;br /&gt;　　卿女随后，&lt;br /&gt;　　林有溪兮。&lt;br /&gt;　　卿女随蹈，&lt;br /&gt;　　春日长兮。&lt;br /&gt;　　连我襟袂徜徉兮，&lt;br /&gt;　　虽往世而不弃。&lt;br /&gt;　　无恨慕而相顾兮，&lt;br /&gt;　　为楚楚动我心。&lt;br /&gt;　　连我襟袂徜徉兮，&lt;br /&gt;　　虽往世而不离。&lt;br /&gt;　　无恨衰而相绝兮，&lt;br /&gt;　　为瑟瑟终此生。&lt;br /&gt;&lt;br /&gt;来源：&lt;a href="http://cache.tianya.cn/publicforum/content/funinfo/1/1062439.shtml"&gt;http://cache.tianya.cn/publicforum/content/funinfo/1/1062439.shtml&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-7254353122505124968?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/7254353122505124968/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=7254353122505124968&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7254353122505124968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7254353122505124968'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/10/blog-post.html' title='新词古译'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-5045191330357100424</id><published>2008-10-07T07:54:00.000-07:00</published><updated>2008-10-07T08:09:19.872-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>大于一维的 C++ 代码</title><content type='html'>先看段C++代码，是我从D新闻组看来的：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CG0kNA3vehM/SOt7hsCbBiI/AAAAAAAAACI/hDFphtMNfcA/s1600-h/nb_c%2B%2B_code.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CG0kNA3vehM/SOt7hsCbBiI/AAAAAAAAACI/hDFphtMNfcA/s400/nb_c%2B%2B_code.png" alt="" id="BLOGGER_PHOTO_ID_5254429208945034786" border="0" /&gt;&lt;/a&gt;怎么样，这可是完全合法的 ASNI C++ 代码，比混乱 C 大赛的程序要牛逼得多吧？实现这种超炫效果的诀窍在于疯狂的操作符重载，在&lt;a href="http://www.xs4all.nl/%7Eweegen/eelis/analogliterals.xhtml"&gt;这里&lt;/a&gt;有完整的介绍和代码供内分泌水平高的同志们折腾。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-5045191330357100424?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/5045191330357100424/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=5045191330357100424&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5045191330357100424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5045191330357100424'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/10/cd-assert-o-o-l-l-l-o-o-o-l-l-l-o-o.html' title='大于一维的 C++ 代码'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CG0kNA3vehM/SOt7hsCbBiI/AAAAAAAAACI/hDFphtMNfcA/s72-c/nb_c%2B%2B_code.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-7369356242559670517</id><published>2008-09-14T08:07:00.000-07:00</published><updated>2008-09-14T08:16:28.934-07:00</updated><title type='text'>电脑修得好，好人当到老</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CG0kNA3vehM/SM0pB6W9ISI/AAAAAAAAAA8/6W8WcP472bs/s1600-h/Pcgoodman.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CG0kNA3vehM/SM0pB6W9ISI/AAAAAAAAAA8/6W8WcP472bs/s320/Pcgoodman.jpg" alt="" id="BLOGGER_PHOTO_ID_5245894253778641186" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CG0kNA3vehM/SM0prQxRU4I/AAAAAAAAABE/OpXpeVcxwVs/s1600-h/Goodmanmsn.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CG0kNA3vehM/SM0prQxRU4I/AAAAAAAAABE/OpXpeVcxwVs/s320/Goodmanmsn.jpg" alt="" id="BLOGGER_PHOTO_ID_5245894964169233282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;小结一下：&lt;br /&gt;      &lt;blockquote&gt;1. 我们还是当朋友好了　→　其实你还是有多馀的利用价值&lt;br /&gt;      2. 我想我真的不适合你 →　我根本就不喜欢你&lt;br /&gt;      3. 天气好冷喔,手都快结冰了 →　快牵我的手吧，大木头&lt;br /&gt;      4. 我觉得我需要更多一点的空间 →　我不太想看到你啦！&lt;br /&gt;      5. 其实你人很好 →　我不想跟你在一起&lt;br /&gt;      6. 你人真的很好 →　我真的不想跟你在一起&lt;br /&gt;      7. 你人真的真的很好..... 真的 →　猪头，离我远一点&lt;br /&gt;      8. 我暂时不想交男朋友 →　闪边啦！！！你还不到我心中帅哥标准的一半&lt;br /&gt;      9. 我不想伤害我们之间的友谊 →　我们之间也永远只会有友谊&lt;br /&gt;     10. 你这样让我感到很尴尬 →　我无法强迫自己说我不想说的答桉&lt;br /&gt;     11. 我的心中牵挂着一个人 →　那个人是我特地虚设用来挡像你这种人的&lt;br /&gt;     12. 我们现在的关係很好ㄚ →　你再给我得寸进尺试试看！！！猪头&lt;br /&gt;     13. 朋友才是长久的，不是吗？ →　想当我男朋友，自己不照照镜子&lt;br /&gt;     14. 我从来没想过这个问题说 →　这根本是不可能的嘛！别做白日梦啦&lt;br /&gt;     15. 我不适合当个情人 →　废话，没有人会适合当你情人的啦&lt;br /&gt;     16. 你给我个时间考虑 →　没给我时间，我怎麽跑得掉……&lt;br /&gt;     17. 我不可能变班对的 →　虽然理由很烂，不过挡你绰绰有馀啦&lt;br /&gt;     18. 我们的距离太远了 →　当个朋友就不错了，还想有的没的&lt;br /&gt;     19. 你的条件真的很好 →　你的条件真的还没好的我想要的地步&lt;br /&gt;     20. 可是…这样好怪…真的很怪 →　你这丑八怪…怪成这样还想吃天鹅肉？&lt;br /&gt;     21. 我觉得男女之间是真的有纯友谊的 →　对，没错，我如你之间就真的只可能有纯友谊&lt;br /&gt;     22. 坐妳的机车可以呀，骑机车很方便的 →　穷小子，没汽车还敢来接送我&lt;br /&gt;     23. 但你的温柔我会铭记在心的 →　情圣！！光温柔是没用的，还需要钱…钱…&lt;br /&gt;     24. 其实我一直没有勇气接受你 →　看到你差点吓死…哪裡还有勇气？&lt;br /&gt;     25. 你真可爱 →　你真幼稚&lt;br /&gt;     26. 你真的是超级可爱耶 →　猪头！！不要像小朋友一样黏啦！！&lt;br /&gt;     27. 遇到你，总会让我重温童年的快乐 →　感觉就像阿姨遇到小弟弟一样&lt;br /&gt;     28. 我觉得你很乖耶 →　穿得俗不拉基的，一看就知道跟你出去不好玩&lt;br /&gt;     29. 我们应该给彼此一点缓冲时间 →　给你时间滚！你再不走，我真的会翻脸！&lt;br /&gt;     30. 上次迟到真的很不好意思 →　先迟到给你看，下次我绝对不会到！&lt;br /&gt;     31. 别人都说你条件不错耶 →　我从来没这样认为过。&lt;br /&gt;     32. 如果我们早一点认识就好了 →　说不定你会早点觉悟。&lt;br /&gt;     33. 别急嘛，我们可以先作朋友 →　我可以趁这个时候找男朋友&lt;br /&gt;&lt;/blockquote&gt;以上材料均来自：&lt;a href="http://uncyclopedia.tw/wiki/%E5%A5%BD%E4%BA%BA"&gt;偽基百科&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-7369356242559670517?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/7369356242559670517/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=7369356242559670517&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7369356242559670517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7369356242559670517'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/09/blog-post_14.html' title='电脑修得好，好人当到老'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CG0kNA3vehM/SM0pB6W9ISI/AAAAAAAAAA8/6W8WcP472bs/s72-c/Pcgoodman.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-9163389254333704083</id><published>2008-09-05T23:03:00.001-07:00</published><updated>2008-09-05T23:04:09.300-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'>D语言 struct constrcutor 的 bug</title><content type='html'>&lt;div class="blog_content"&gt;     &lt;p&gt;今天有空测试了一下 D语言 2.0 最新增加的 struct constructor 特性，结果刚来就发现一个大 bug:&lt;/p&gt; &lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;D2.0 代码&lt;/div&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;import std.stdio;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;struct&lt;/span&gt;&lt;span&gt; Foo  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; x;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; y;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; main()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;    Foo f3 = 123;  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre style="display: none;" name="code" class="c#"&gt;import std.stdio;  struct Foo {     int x;     int y; }  void main() {     Foo f3 = 123; }&lt;/pre&gt; &lt;p&gt; 上面这个程序居然能在 DMD 2.019 的编译器上编译通过，真是不可思议。&lt;/p&gt;        &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-9163389254333704083?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/9163389254333704083/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=9163389254333704083&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/9163389254333704083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/9163389254333704083'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/09/d-struct-constrcutor-bug.html' title='D语言 struct constrcutor 的 bug'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-3104233930593862975</id><published>2008-09-04T22:09:00.000-07:00</published><updated>2008-09-04T22:13:50.688-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='杂项'/><title type='text'>网民们是真正的英雄，而我们自己往往是幼稚可笑的</title><content type='html'>上网这么多年，今天终于看到了这首最震撼，最有意境的现代诗了：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;啊!&lt;br /&gt;一打开电脑&lt;br /&gt;又读到诗了&lt;br /&gt;好安逸&lt;br /&gt;阳光从窗户射进指缝&lt;br /&gt;好想脱光身体&lt;br /&gt;和自然交配&lt;br /&gt;谁又来敲门了&lt;br /&gt;等等&lt;br /&gt;我的思想还在裸露&lt;/blockquote&gt;孕育自：&lt;a href="http://comment.news.163.com/news_shehui6_bbs/4KVLD9T700011229.html"&gt;http://comment.news.163.com/news_shehui6_bbs/4KVLD9T700011229.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-3104233930593862975?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/3104233930593862975/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=3104233930593862975&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3104233930593862975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3104233930593862975'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/09/blog-post_04.html' title='网民们是真正的英雄，而我们自己往往是幼稚可笑的'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-2257393841027472615</id><published>2008-09-02T07:02:00.000-07:00</published><updated>2008-09-02T07:03:51.102-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='杂项'/><title type='text'>恶搞的“维基百科”</title><content type='html'>也许是世界上最恶搞的网站了，看看他们的中文“星条旗永无错”词条：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;啊！在晨曦初现时，你可看见  是什么让我们如此骄傲？  在黎明的最后一道曙光中欢呼，  是谁的旗帜在激战中始终高扬！  烈火熊熊，炮声隆隆，  我们看到要塞上那面英勇的旗帜  在黑暗过后依然耸立！  啊！你说那星条旗是否会静止，  在自由的土地上飘舞，  在勇者的家园上飞扬？  &lt;/p&gt;&lt;p&gt;&lt;br /&gt;啊！在晨曦初现时，你可看见  是什么让我们如此骄傲？  在集中营中为所欲为，  谁让我们在战场上节节败退！  烈火熊熊，炮声隆隆，  我们削平了上甘岭的山头，  它怎应该依然耸立！  啊！你说那星条旗是否会有一天，  与太极旗一同，  在高丽的全境飞扬？  &lt;/p&gt;&lt;p&gt;&lt;br /&gt;啊！在晨曦初现时，你可看见  是什么让我们如此骄傲？  在美莱村我们尽情扫射，  只因有些人可能名叫越共！  烈火熊熊，炮声隆隆，  尽管要塞上那南越的旗帜降下  我们美军依然要自称英雄！  啊！你说那星条旗是否会有一天，  能重新插上堡垒，  在越南的国土上飞扬？  &lt;/p&gt;&lt;p&gt;&lt;br /&gt;啊！在晨曦初现时，你可看见  是什么让我们如此骄傲？  到底有无&lt;a href="http://zh.uncyclopedia.wikia.com/index.php?title=%E5%A4%A7%E6%9D%80%E5%99%A8&amp;amp;variant=zh-hans" title="大杀器"&gt;大杀器&lt;/a&gt;，当然可以不管，  只要我的主脑能喝到&lt;a href="http://zh.uncyclopedia.wikia.com/index.php?title=%E7%9F%B3%E6%B2%B9&amp;amp;action=edit" class="new" title="石油"&gt;石油&lt;/a&gt;！  烈火熊熊，炮声隆隆，  我们只看到油井边那面英勇的旗帜  在&lt;a href="http://zh.uncyclopedia.wikia.com/index.php?title=%E8%90%A8%E8%BE%BE%E5%A7%86&amp;amp;variant=zh-hans" title="萨达姆"&gt;萨达姆&lt;/a&gt;死后依然耸立！  啊！你说那星条旗是否会停止扩散，  在伊拉克的土地上飘舞，  在美利坚的新国土上飞扬？ &lt;/p&gt;&lt;/blockquote&gt;From:&lt;a href="http://zh.uncyclopedia.wikia.com/index.php?title=%E6%98%9F%E6%9D%A1%E6%97%97%E6%B0%B8%E6%97%A0%E9%94%99&amp;amp;variant=zh-hans"&gt; http://zh.uncyclopedia.wikia.com/index.php?title=%E6%98%9F%E6%9D%A1%E6%97%97%E6%B0%B8%E6%97%A0%E9%94%99&amp;amp;variant=zh-hans&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;是滴，看这个是需要翻墙滴。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-2257393841027472615?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/2257393841027472615/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=2257393841027472615&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2257393841027472615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2257393841027472615'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/09/blog-post.html' title='恶搞的“维基百科”'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-4193753624046326411</id><published>2008-08-30T06:55:00.000-07:00</published><updated>2008-08-30T06:56:02.816-07:00</updated><title type='text'>The song about lost love</title><content type='html'>The song about lost love:&lt;br /&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="点击这里使 Adblock Plus 过滤该对象" class="abp-objtab-039366061971767186 visible" href="http://www.youtube.com/v/aHxqPg2CsJI&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/a&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/aHxqPg2CsJI&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/aHxqPg2CsJI&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-4193753624046326411?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/4193753624046326411/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=4193753624046326411&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4193753624046326411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4193753624046326411'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/08/song-about-lost-love.html' title='The song about lost love'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-4959579475396622584</id><published>2008-08-07T22:50:00.000-07:00</published><updated>2008-08-07T22:51:18.659-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='废话'/><title type='text'>给豆瓣个面子</title><content type='html'>豆瓣非要我写篇有 doubanclaim8a2813bcb3a0f1d3 的文章，没办法，满足它啦。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-4959579475396622584?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/4959579475396622584/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=4959579475396622584&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4959579475396622584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4959579475396622584'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/08/blog-post.html' title='给豆瓣个面子'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-3342988077349401027</id><published>2008-07-29T07:17:00.000-07:00</published><updated>2008-07-29T07:19:31.538-07:00</updated><title type='text'>冷笑话</title><content type='html'>冷笑话一枚：&lt;br /&gt;&lt;br /&gt;中国运动会：One World One Dream&lt;br /&gt;美国运动会：One Dream One World&lt;br /&gt;&lt;br /&gt;来源：忘了&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-3342988077349401027?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/3342988077349401027/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=3342988077349401027&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3342988077349401027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3342988077349401027'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/07/blog-post_29.html' title='冷笑话'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-8468554414469756325</id><published>2008-07-25T05:16:00.000-07:00</published><updated>2008-07-25T05:18:59.086-07:00</updated><title type='text'>Tango 0.99.7 Dominik 今天放出</title><content type='html'>详细的发布公告：&lt;br /&gt;&lt;a href="http://www.dsource.org/projects/tango/wiki/0_99_7_release"&gt;http://www.dsource.org/projects/tango/wiki/0_99_7_release&lt;/a&gt;&lt;br /&gt;最要紧的改进莫过于添加了新的 container 包了，不知是 tango.util.container 还是 tango.util.collection？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-8468554414469756325?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/8468554414469756325/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=8468554414469756325&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8468554414469756325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8468554414469756325'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/07/tango-0997-dominik.html' title='Tango 0.99.7 Dominik 今天放出'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-5505497841713728739</id><published>2008-07-23T17:46:00.001-07:00</published><updated>2008-07-23T17:46:46.979-07:00</updated><title type='text'>举报非法网站</title><content type='html'>向祖国举报一个非法网站：&lt;br /&gt;http://www.sjbbf.com/&lt;br /&gt;没有备案，恶搞国家领导人。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-5505497841713728739?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/5505497841713728739/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=5505497841713728739&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5505497841713728739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5505497841713728739'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/07/blog-post.html' title='举报非法网站'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-5562255552923056910</id><published>2008-06-30T07:28:00.000-07:00</published><updated>2008-06-30T07:54:57.884-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='非技术'/><title type='text'>BlogSpot解封了</title><content type='html'>BlogSpot 的解封也有一段时间了，看起来亲爱的派对暂时还没有封的意思，既然皇恩这么浩荡，那咱就用用先。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-5562255552923056910?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/5562255552923056910/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=5562255552923056910&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5562255552923056910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5562255552923056910'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2008/06/blogspot.html' title='BlogSpot解封了'/><author><name>老革命</name><uri>http://www.blogger.com/profile/17300453276612528921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://1.bp.blogspot.com/_CG0kNA3vehM/SZtr590s0OI/AAAAAAAAAJ0/5cDQsRmTOes/S220/face.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-7818950319028281384</id><published>2007-03-15T08:44:00.000-07:00</published><updated>2007-03-15T09:02:55.935-07:00</updated><title type='text'>Ubuntu 7.04</title><content type='html'>Fedora6 越用越慢，最不靠谱的是自动升级以后竟然用不了我自己装的 Firefox2，在实在是忍无可忍的情况下闪过了一个换 Ubuntu 6.10 的念头，结果我就用上了 ubuntu.....&lt;br /&gt;可是 6.10 终究不是最新版，终于一狠心一跺脚把 6.10 升级成 7.04，下面是本免费小白鼠的亲身体验：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;升级很顺利，直接 apt-get update &amp;amp; apt-get dist-upgrade 就搞定了，基本的设置没有变化，不过我刚配置好的字体又回去了。&lt;/li&gt;&lt;li&gt;感觉 gnome 的速度上来了一点，不过感觉还是没刚装好的 fedora6 快。Firefox的速度倒是有进步。&lt;/li&gt;&lt;li&gt;不错的国际象棋游戏&lt;/li&gt;&lt;li&gt;右下角的网络图标显示错误，这么显眼的bug竟然能够存在&lt;/li&gt;&lt;li&gt;to be continued....&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-7818950319028281384?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/7818950319028281384/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=7818950319028281384&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7818950319028281384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7818950319028281384'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/03/ubuntu-704.html' title='Ubuntu 7.04'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-8686627964889072688</id><published>2007-03-01T22:04:00.000-08:00</published><updated>2008-06-30T07:57:25.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='元编程'/><category scheme='http://www.blogger.com/atom/ns#' term='泛型'/><category scheme='http://www.blogger.com/atom/ns#' term='STL'/><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'>抛砖：TypeTuple 的简单算法</title><content type='html'>D语言的 TypeTuple既然可以按数组的方式操作，我觉得应该可以对其增加更多的算法，下面的 RemoveIf就是一个例子：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 1 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(140, 0, 0);"&gt;module&lt;/span&gt; dust.meta.tuple;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 2 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 3 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(140, 0, 0);"&gt;import&lt;/span&gt; std.typetuple;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 4 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 5 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 6 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; RemoveIf(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; PredTempl, TList...)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 7 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 8 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; (TList.length == &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 9 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; TList RemoveIf;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;10 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; (PredTempl!(TList[&lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;]))&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;11 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; RemoveIf!(Size, TList[&lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt; .. length]) RemoveIf;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;12 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;13 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; TypeTuple!(TList[&lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;], RemoveIf!(Size, TList[&lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt; .. length])) RemoveIf;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;14 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;15 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;16 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; Foreach(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; PredTempl, TList...)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;17 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;18 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(TList.length == &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;19 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; TList Foreach;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;20 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;21 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;22 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; PredTempl!(TList[&lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;]) Dummy_;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;23 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; Foreach!(PredTempl, TList[&lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt; .. length]) Foreach;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;24 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;25 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;26 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;27 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;28 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; Size(T)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;29 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;30 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/span&gt; Size = T.sizeof == &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;.sizeof;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;31 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;32 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;33 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; Print(T)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;34 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;35 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; Print = &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;36 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(140, 0, 0);"&gt;pragma&lt;/span&gt;(msg, T.stringof);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;37 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;38 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;39 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; main()&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;40 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;41 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; TypeTuple!(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;long&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;) T;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;42 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; RemoveIf!(Size, T) T2;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;43 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; Foreach!(Print, T2) forEach;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;44 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;45 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;这个RemoveIf模板的效果几乎和C++ STL 中的 remove_if 一样，提供一个谓词:PredTempl，RemoveIf最终得到处理后的TypeTuple。类似还可以实现 sort，unique等等算法，方便 TypeTuple的使用。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-8686627964889072688?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/8686627964889072688/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=8686627964889072688&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8686627964889072688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8686627964889072688'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/03/typetuple.html' title='抛砖：TypeTuple 的简单算法'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-5831881787428362811</id><published>2007-02-26T07:58:00.000-08:00</published><updated>2008-06-30T07:59:39.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'>最有建设性的建议</title><content type='html'>在火星新闻组上有人建议把D语言改名为Diamond，以期吸引公众更多的关注。俺也非常同意这个想法，毕竟 diamond 比 ruby，pe(a)rl 值钱得多  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-5831881787428362811?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/5831881787428362811/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=5831881787428362811&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5831881787428362811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5831881787428362811'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/blog-post_26.html' title='最有建设性的建议'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-8955893338186777791</id><published>2007-02-26T07:33:00.000-08:00</published><updated>2008-06-30T07:59:00.888-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'>port boost.variant to D</title><content type='html'>今晚无聊，完整用D实现了Boost.Variant 的绝大部分，权当娱乐了。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  1 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 101, 0);"&gt;// Module:  variant.d&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  2 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 101, 0);"&gt;// Author:  Oldrev (wstring#AT#gmail.com)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  3 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 101, 0);"&gt;// License: BSD&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  4 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  5 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(140, 0, 0);"&gt;module&lt;/span&gt; dust.meta.variant;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  6 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  7 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(140, 0, 0);"&gt;import&lt;/span&gt; std.typetuple;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  8 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(140, 0, 0);"&gt;import&lt;/span&gt; std.traits;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  9 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 10 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; MaxSizeImp(T, V...)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 11 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 12 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(V.length &amp;gt; &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 13 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; tailResult = MaxSizeImp!(V).result;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 14 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 15 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; tailResult = T.sizeof;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 16 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 17 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; result = T.sizeof &amp;gt; tailResult ? T.sizeof : tailResult;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 18 &lt;/span&gt;&lt;/span&gt;};&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 19 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 20 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; MaxSize(TList...)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 21 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 22 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; MaxSize = MaxSizeImp!(TList).result;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 23 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 24 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 25 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt; Variant(TList...)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 26 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 27 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; TList TypeList;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 28 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; Variant!(TypeList) SelfType;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 29 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;ubyte&lt;/b&gt;&lt;/span&gt;[MaxSize!(TypeList)] Holder;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 30 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 31 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; Holder  m_held;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 32 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;     m_which = -&lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 33 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 34 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; which()&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 35 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 36 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; m_which;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 37 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 38 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 39 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; SelfType assign(ValueType)(ValueType val)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 40 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 41 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;is&lt;/b&gt;&lt;/span&gt;(ValueType == SelfType))&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 42 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 43 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/span&gt;(T; TypeList)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 44 &lt;/span&gt;&lt;/span&gt;            {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 45 &lt;/span&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(T, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 46 &lt;/span&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(val.which == i)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 47 &lt;/span&gt;&lt;/span&gt;                {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 48 &lt;/span&gt;&lt;/span&gt;                    assign!(T)(val.get!(T));&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 49 &lt;/span&gt;&lt;/span&gt;                    m_which = i;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 50 &lt;/span&gt;&lt;/span&gt;                }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 51 &lt;/span&gt;&lt;/span&gt;            }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 52 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 53 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 54 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 55 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(ValueType, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 56 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(i &amp;gt;= &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 57 &lt;/span&gt;&lt;/span&gt;            ValueType* heldPtr = &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;cast&lt;/b&gt;&lt;/span&gt;(ValueType*)m_held.ptr;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 58 &lt;/span&gt;&lt;/span&gt;            *heldPtr = val;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 59 &lt;/span&gt;&lt;/span&gt;            m_which = i;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 60 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 61 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 62 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 63 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 64 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 65 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; SelfType opAssign(ValueType)(ValueType rhs)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 66 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 67 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; assign!(ValueType)(rhs);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 68 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 69 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 70 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/span&gt; opEquals(ValueType)(ValueType rhs)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 71 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 72 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;is&lt;/b&gt;&lt;/span&gt;(ValueType == SelfType))&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 73 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 74 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/span&gt;(T; TypeList)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 75 &lt;/span&gt;&lt;/span&gt;            {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 76 &lt;/span&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(T, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 77 &lt;/span&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(i == which)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 78 &lt;/span&gt;&lt;/span&gt;                {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 79 &lt;/span&gt;&lt;/span&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; (rhs.which == which) &amp;amp;&amp;amp; (get!(T) == rhs.get!(T));&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 80 &lt;/span&gt;&lt;/span&gt;                }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 81 &lt;/span&gt;&lt;/span&gt;            }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 82 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 83 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 84 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 85 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(ValueType, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 86 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(i &amp;gt;= &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 87 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 88 &lt;/span&gt;&lt;/span&gt;            ValueType* heldPtr = &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;cast&lt;/b&gt;&lt;/span&gt;(ValueType*)m_held.ptr;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 89 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; *heldPtr == rhs;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 90 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 91 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 92 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 93 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; opCmp(ValueType)(ValueType rhs)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 94 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 95 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(rhs == *&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;)&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 96 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;is&lt;/b&gt;&lt;/span&gt;(ValueType == SelfType))&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 97 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 98 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/span&gt;(T; TypeList)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; 99 &lt;/span&gt;&lt;/span&gt;            {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;100 &lt;/span&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(T, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;101 &lt;/span&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;((i == which) &amp;amp;&amp;amp; (rhs.which == which))&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;102 &lt;/span&gt;&lt;/span&gt;                {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;103 &lt;/span&gt;&lt;/span&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; get!(T) &amp;lt; rhs.get!(T) ? -&lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt; : &lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;104 &lt;/span&gt;&lt;/span&gt;                }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;105 &lt;/span&gt;&lt;/span&gt;            }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;106 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;107 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;108 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;109 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(ValueType, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;110 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(i &amp;gt;= &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;111 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;112 &lt;/span&gt;&lt;/span&gt;            ValueType* heldPtr = &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;cast&lt;/b&gt;&lt;/span&gt;(ValueType*)m_held.ptr;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;113 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; *heldPtr &amp;lt; rhs ? -&lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt; : &lt;span style="color: rgb(140, 0, 0);"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;114 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;115 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;116 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;117 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; TypeInfo type()&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;118 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;119 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/span&gt;(T; TypeList)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;120 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;121 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(T, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;122 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(i == which)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;123 &lt;/span&gt;&lt;/span&gt;            {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;124 &lt;/span&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;typeid&lt;/b&gt;&lt;/span&gt;(TypeList[i]);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;125 &lt;/span&gt;&lt;/span&gt;            }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;126 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;127 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;128 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;129 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; ValueType get(ValueType)()&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;130 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;131 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; *(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;cast&lt;/b&gt;&lt;/span&gt;(ValueType*)m_held.ptr);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;132 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;133 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;134 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/span&gt; empty()&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;135 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;136 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; m_which &amp;lt; &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;137 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;138 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;139 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/span&gt; isKindOf(ValueType)(ValueType val)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;140 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;141 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; i = IndexOf!(ValueType, TypeList);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;142 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(i &amp;gt;= &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;143 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; which == i;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;144 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;145 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;146 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;147 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;148 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;unittest&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;149 &lt;/span&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;150 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; Foo&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;151 &lt;/span&gt;&lt;/span&gt;    {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;152 &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;        &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;153 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; n = &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;154 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; x = &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;155 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; y = &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;156 &lt;/span&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; z = &lt;span style="color: rgb(140, 0, 0);"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;157 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;158 &lt;/span&gt;&lt;/span&gt;        Foo opAssign(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; rhs)&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;159 &lt;/span&gt;&lt;/span&gt;        {&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;160 &lt;/span&gt;&lt;/span&gt;            z = rhs;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;161 &lt;/span&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;162 &lt;/span&gt;&lt;/span&gt;        }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;163 &lt;/span&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;164 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;165 &lt;/span&gt;&lt;/span&gt;    Variant!(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;double&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[], Foo) v;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;166 &lt;/span&gt;&lt;/span&gt;    v = &lt;span style="color: rgb(140, 0, 0);"&gt;2&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;167 &lt;/span&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;   assert&lt;/b&gt;&lt;/span&gt;(v == &lt;span style="color: rgb(140, 0, 0);"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;168 &lt;/span&gt;&lt;/span&gt;    v = &lt;span style="color: rgb(140, 0, 0);"&gt;2.22&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;169 &lt;/span&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;   assert&lt;/b&gt;&lt;/span&gt;(v == &lt;span style="color: rgb(140, 0, 0);"&gt;2.22&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;170 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(v.type == &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;typeid&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;double&lt;/b&gt;&lt;/span&gt;));&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;171 &lt;/span&gt;&lt;/span&gt;    v = &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; Foo;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;172 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(v.type == &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;typeid&lt;/b&gt;&lt;/span&gt;(Foo));&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;173 &lt;/span&gt;&lt;/span&gt;    v.get!(Foo)() = &lt;span style="color: rgb(140, 0, 0);"&gt;2&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;174 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(v.get!(Foo)().z == &lt;span style="color: rgb(140, 0, 0);"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;175 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt;(v) v2 = v;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;176 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(v2 == v);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;177 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(v &amp;lt;= &lt;span style="color: rgb(140, 0, 0);"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;178 &lt;/span&gt;&lt;/span&gt;    v = &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;cast&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[])&lt;span style="color: rgb(140, 0, 0);"&gt;"Foobar"&lt;/span&gt;;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;179 &lt;/span&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/span&gt;(v == &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;cast&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[])&lt;span style="color: rgb(140, 0, 0);"&gt;"Foobar"&lt;/span&gt;);&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;180 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(173, 170, 173);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;181 &lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-8955893338186777791?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/8955893338186777791/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=8955893338186777791&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8955893338186777791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/8955893338186777791'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/port-boostvariant-to-d.html' title='port boost.variant to D'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-5668890808547977837</id><published>2007-02-24T10:19:00.000-08:00</published><updated>2008-06-30T07:59:58.402-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'>D语言在编译期添加变量</title><content type='html'>今天终于研究出了用递归模板实现D语言编译时字符串连接的方法，我实在是高兴得不得了。&lt;br /&gt;其实方法很简单，一点就破，下面的代码很好的说明了问题，在编译时16行会在 main() 函数体内添加三个变量，分别是：int foo0, long foo1, float foo2。&lt;br /&gt;用这种方法甚至可以在编译期为类添加成员函数、变量、类型定义等等，反正只要是符合语法的就可以，不像 mixin template 有那么多的限制。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; std.metastrings;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 2 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; std.stdio;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 3 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 4 &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; GenVars(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; N, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] S, T, V...)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 5 &lt;/span&gt;{&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 6 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] Result = S ~ Format!(&lt;span style="color: rgb(255, 0, 255);"&gt;"%s foo%s;"&lt;/span&gt;, T.stringof, N);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 7 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/span&gt; { Index = N + &lt;span style="color: rgb(255, 0, 255);"&gt;1&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 8 &lt;/span&gt;    &lt;span style="color: rgb(160, 32, 240);"&gt;pragma&lt;/span&gt;(msg, Result ~ &lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt;\n&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 9 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(V.length &amp;gt; &lt;span style="color: rgb(255, 0, 255);"&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;10 &lt;/span&gt;        &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt; GenVars!(Index, Result, V);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;11 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;12 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;13 &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; main()&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;14 &lt;/span&gt;{&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;15 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;16 &lt;/span&gt;    &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt;(GenVars!(&lt;span style="color: rgb(255, 0, 255);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;""&lt;/span&gt;, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;long&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;float&lt;/b&gt;&lt;/span&gt;).Result);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;17 &lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-5668890808547977837?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/5668890808547977837/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=5668890808547977837&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5668890808547977837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/5668890808547977837'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/d.html' title='D语言在编译期添加变量'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-3736772179829492614</id><published>2007-02-23T00:31:00.000-08:00</published><updated>2008-06-30T07:59:23.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tango'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><category scheme='http://www.blogger.com/atom/ns#' term='DLL'/><title type='text'>Tango，我来了</title><content type='html'>昨天夜里我把我自己写的DLL包装类代码贴到了D语言新闻组里，没想到 tango库（准标准库，类似C++的Boost）开发小组的Kris Bell问我是否愿意把代码捐献给tango库，还说什么呢，当然是一千个愿意，一万个愿意啦！&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-3736772179829492614?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/3736772179829492614/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=3736772179829492614&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3736772179829492614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3736772179829492614'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/tango.html' title='Tango，我来了'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-4309577975617231757</id><published>2007-02-22T11:22:00.000-08:00</published><updated>2008-06-30T07:58:32.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><category scheme='http://www.blogger.com/atom/ns#' term='DLL'/><title type='text'>一切皆有可能!</title><content type='html'>今天晚上在牺牲了N^N个脑细胞之后，终于实现了上一帖所设想的DLL包装类（把Proc换成Symbol），源程序已经通过了编译，可以运行，当然还不够强壮。大半夜的趁着这股热乎劲，贴上来玩玩。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  1 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; std.c.windows.windows;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  2 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; std.stdio;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  3 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; std.traits;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  4 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; std.string;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  5 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; std.utf;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  6 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  7 &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt; Symbol(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] SymName, Ret, Params...)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  8 &lt;/span&gt;{&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;  9 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; Params        Parameters;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 10 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; Ret           ReturnValue;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 11 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] Name = SymName;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 12 &lt;/span&gt;    &lt;span style="color: rgb(160, 32, 240);"&gt;extern&lt;/span&gt;(Windows) &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;alias&lt;/b&gt;&lt;/span&gt; ReturnValue &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;function&lt;/b&gt;&lt;/span&gt;(Params) FunctionType;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 13 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 14 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 15 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;// FP_Function&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 16 &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; MixinMember(S) &lt;span style="color: rgb(0, 0, 255);"&gt;//S = Symbol template&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 17 &lt;/span&gt;{&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 18 &lt;/span&gt;    &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;"public alias S.FunctionType FP_"&lt;/span&gt; ~ S.Name ~ &lt;span style="color: rgb(255, 0, 255);"&gt;";"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 19 &lt;/span&gt;    &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(255, 0, 255);"&gt;"public S.FunctionType "&lt;/span&gt; ~ S.Name ~ &lt;span style="color: rgb(255, 0, 255);"&gt;";"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 20 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 21 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 22 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 23 &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt; MixinAllMembers(S, V...)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 24 &lt;/span&gt;{&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 25 &lt;/span&gt;    &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt; MixinMember!(S);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 26 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(V.length &amp;gt; &lt;span style="color: rgb(255, 0, 255);"&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 27 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 28 &lt;/span&gt;        &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt; MixinAllMembers!(V);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 29 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 30 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 31 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 32 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 33 &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; Module(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] Path, Symbols...)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 34 &lt;/span&gt;{&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 35 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; HMODULE m_handle = &lt;span style="color: rgb(255, 0, 255);"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 36 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 37 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt; MixinAllMembers!(Symbols);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 38 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 39 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;()&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 40 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 41 &lt;/span&gt;        load(Path);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 42 &lt;/span&gt;        initMembers();&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 43 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 44 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 45 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; ~&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;()&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 46 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 47 &lt;/span&gt;        free();&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 48 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 49 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 50 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; initMembers()&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 51 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 52 &lt;/span&gt;        &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/span&gt; (i, S; Symbols)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 53 &lt;/span&gt;        {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 54 &lt;/span&gt;            &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;mixin&lt;/b&gt;&lt;/span&gt;(S.Name ~ &lt;span style="color: rgb(255, 0, 255);"&gt;" = getSymbol!(FP_"&lt;/span&gt; ~ S.Name ~ &lt;span style="color: rgb(255, 0, 255);"&gt;")(S.Name);"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 55 &lt;/span&gt;        }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 56 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 57 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 58 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; load(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] path)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 59 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 60 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 61 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;//       m_handle = LoadLibraryW(toUtf16z(path));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 62 &lt;/span&gt;        m_handle = LoadLibraryA(toStringz(path));&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 63 &lt;/span&gt; &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;       assert&lt;/b&gt;&lt;/span&gt;(m_handle);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 64 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 65 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 66 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; free()&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 67 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 68 &lt;/span&gt;        &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(m_handle != &lt;span style="color: rgb(255, 0, 255);"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 69 &lt;/span&gt;        {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 70 &lt;/span&gt;            FreeLibrary(m_handle);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 71 &lt;/span&gt;            m_handle = &lt;span style="color: rgb(255, 0, 255);"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 72 &lt;/span&gt;        }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 73 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 74 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 75 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; T getSymbol(T)(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] sym)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 76 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 77 &lt;/span&gt;        &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;cast&lt;/b&gt;&lt;/span&gt;(T)getSymbol1(sym);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 78 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 79 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 80 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;* getSymbol1(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;[] sym)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 81 &lt;/span&gt;    {&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 82 &lt;/span&gt;        &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; GetProcAddress(m_handle, toStringz(sym));&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 83 &lt;/span&gt;    }&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 84 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 85 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 86 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 87 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 88 &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; main()&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 89 &lt;/span&gt;{&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 90 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 91 &lt;/span&gt;    &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;auto&lt;/b&gt;&lt;/span&gt; dll = &lt;span style="color: rgb(128, 64, 64);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; Module!(&lt;span style="color: rgb(255, 0, 255);"&gt;"User32.dll"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 92 &lt;/span&gt;            Symbol!(&lt;span style="color: rgb(255, 0, 255);"&gt;"MessageBoxW"&lt;/span&gt;, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;, HWND, LPCWSTR, LPCWSTR, UINT),&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 93 &lt;/span&gt;            Symbol!(&lt;span style="color: rgb(255, 0, 255);"&gt;"MessageBoxA"&lt;/span&gt;, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;, HWND, LPCSTR, LPCSTR, UINT)&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 94 &lt;/span&gt;            );&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 95 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 96 &lt;/span&gt;    dll.MessageBoxW(&lt;span style="color: rgb(255, 0, 255);"&gt;null&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"Hello! DLL! W"&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"Title W"&lt;/span&gt;, MB_OK);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 97 &lt;/span&gt;    dll.MessageBoxA(&lt;span style="color: rgb(255, 0, 255);"&gt;null&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"Hello! DLL! A"&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"Title A"&lt;/span&gt;, MB_OK);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 98 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt; 99 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;100 &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;注意：需要 DMD 1.005+ 编译。&lt;/p&gt;&lt;p&gt;BTW: 这个语法着色是用Vim搞的，很顺眼。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;如需要原始源程序请与我联系：wstring#**.@.**#gmail.com&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-4309577975617231757?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/4309577975617231757/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=4309577975617231757&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4309577975617231757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/4309577975617231757'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/nndll-1-import-std.html' title='一切皆有可能!'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-3039529987630223262</id><published>2007-02-21T06:09:00.000-08:00</published><updated>2008-06-30T07:56:25.029-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'>奋斗一天没成果</title><content type='html'>今天早上突发奇想，想用D语言新增加的mixin和可变参数模板来封装Windows的DLL，结果奋斗了一天也没有结果。我原先设想的是达到类似如下伪码的水平：&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;1 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;//Module 模板第一个参数是DLL路径名，后跟不限个数 Proc 模板。Proc用于定义一个DLL中的函数，第一个参数为函数名，第二个为返回值类型，其余为形参。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;2 &lt;/span&gt;Module!(&lt;span style="color: rgb(255, 0, 255);"&gt;"User32.dll"&lt;/span&gt;, Proc!(&lt;span style="color: rgb(255, 0, 255);"&gt;"MessageBoxW"&lt;/span&gt;, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;, HWND, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;wchar&lt;/b&gt;&lt;/span&gt;*, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;wchar&lt;/b&gt;&lt;/span&gt;*, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;uint&lt;/b&gt;&lt;/span&gt;), Proc!(&lt;span style="color: rgb(255, 0, 255);"&gt;"GetDesktopWindow"&lt;/span&gt;, HWND)) user32;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;3 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;//使用DLL中的函数：&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;4 &lt;/span&gt;user32.MessageBoxW(&lt;span style="color: rgb(255, 0, 255);"&gt;null&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"Hello! World!"&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"Hello!"&lt;/span&gt;, MB_OK);&lt;br /&gt;&lt;span style="color: rgb(128, 64, 64);"&gt;5 &lt;/span&gt;HWND hdesktop = user32.GetDesktopWindow();&lt;span style="color: rgb(128, 64, 64);"&gt;&lt;/span&gt;&lt;/pre&gt;我原本想用函数编译时执行将Proc定义的DLL中的函数生成Module模板的函数指针成员字符串，再用mixin加入Module模板类定义，折腾了一天，结果最后才发现编译时函数执行不支持可变参数，真是苦恼啊，不知哪位高人有更好的解决方法。&lt;br /&gt;顺带说一句，Walter放出了 DMD 1.007，解决了一些Bugs，语法上稍微做了一些调整。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-3039529987630223262?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/3039529987630223262/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=3039529987630223262&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3039529987630223262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/3039529987630223262'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/blog-post_21.html' title='奋斗一天没成果'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-2926069963310998118</id><published>2007-02-16T06:38:00.000-08:00</published><updated>2008-06-30T07:57:40.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='D语言'/><title type='text'>DMD 1.006 来了</title><content type='html'>D语言教主 Walter Bright 今天放出了 DMD 1.006 编译器！最主要的更新是添加了一个叫做编译时执行函数（&lt;a href="http://www.digitalmars.com/d/function.html#interpretation"&gt;Compile Time Execution of Functions&lt;/a&gt;）的功能，顾名思义，就是在编译时对符合要求的函数进行求值。&lt;br /&gt;&lt;br /&gt;这是一个非常有用的特性，以前当我们要在编译时（也就是“元编程”）进行一点稍微负载的常数计算时，往往需要用晦涩的递归模板来进行，不仅功能非常有限而且代码非常难以理解（还记得那个在编译器的出错信息中输出计算结果的C++程序吗？）。现在有了这个功能，我们可以在编译时进行包括递归和循环在内的复杂计算了，换就话说就是DMD编译器初步具有了编译时解释执行D语言代码的能力，真是不可思议！&lt;br /&gt;&lt;br /&gt;Walter，你到底是不是外星人？？？&lt;br /&gt;&lt;br /&gt;附：&lt;a href="http://ftp.digitalmars.com/dmd.1.006.zip"&gt;DMD 1.006&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-2926069963310998118?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/2926069963310998118/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=2926069963310998118&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2926069963310998118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/2926069963310998118'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/dmd-1006.html' title='DMD 1.006 来了'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-7437052630971573017</id><published>2007-02-09T07:48:00.000-08:00</published><updated>2008-06-30T07:55:50.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='熊猫烧香'/><category scheme='http://www.blogger.com/atom/ns#' term='病毒'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>向Windows用户们默哀三秒</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;因为一直研究Linux、FreeBSD的关系，最近才知道“熊猫烧香”病毒近两个月肆虐网络，给 Windowz世界带来了巨大破坏，甚至很多门户网站还为此作了专题。我用google搜索“熊猫烧香”，google给我的答案是：“约有2,420,000项符合熊猫烧香的查询结果”，我估计反病毒公司们现在可是发大了，哈哈。不过我个人觉得这个东西严格来说不应该算是病毒，纯粹就是一破坏程序，病毒还真没这么大张旗鼓又换图标又删服务的。&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:100%;"&gt;Windows用户们由于追求方便和兼容性（最著名的就数QQ了，我看Tencent甚至不知道Windows为用户数据准备的地方在哪里），没有使用 Windows的权限功能，让病毒啊、木马啊什么的很容易就能完全控制整个系统，这几乎是没有办法的事。外国从9x时代过来的软件已经基本都能处理权限问题了，不会再傻乎乎的要求不该有的东西，相反国内的程序很少有注意到这点的，能在 Users 组账号下正常运行的程序几乎见不到。现在是2007年，离 Windows NT 诞生已经过去了14年，还竟然有这么多程序适应不了多用户，真是可悲啊......&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-7437052630971573017?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/7437052630971573017/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=7437052630971573017&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7437052630971573017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/7437052630971573017'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/windows.html' title='向Windows用户们默哀三秒'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-117081864813158247</id><published>2007-02-06T19:24:00.000-08:00</published><updated>2007-02-06T19:24:09.860-08:00</updated><title type='text'>D语言最Cool特性</title><content type='html'>昨天Walter 发布了D语言编译器 DMD 1.005版，添加了有史以来最Cool的语言特性：mixin/import 语句。&lt;br /&gt;mixin(字符串常量表达式) 语句可以在编译时把字符串常量表达式的结果作为源程序的一部分插入到当前作用域中，举个例子来说：&lt;br /&gt;&lt;br /&gt;int a = 2;&lt;br /&gt;mixin("int x = 2; x = 3;");&lt;br /&gt;int y = 6;&lt;br /&gt;x = 4;&lt;br /&gt;&lt;br /&gt;就等价于你亲手写：&lt;br /&gt;int a = 2;&lt;br /&gt;int x = 2; x = 3;&lt;br /&gt;int y = 6;&lt;br /&gt;x = 4;&lt;br /&gt;&lt;br /&gt;更cool的是import语句，import(字符串差常量表达式) 语句可以把字符串常量作为文件名指定的文件内容读入并返回成为另一个字符串常量，比如：&lt;br /&gt;&lt;br /&gt;auto str = import("foo.d");&lt;br /&gt;&lt;br /&gt;执行结果是把 foo.d 文件的内容赋给 str。&lt;br /&gt;&lt;br /&gt;最cool的是把两个语句联合起来使用： mixin(import("foo.d"))，结果就是给 D 语言提供了#include。外加新提供的编译时字符串操纵库，使得D拥有了威力无比的meta编程能力，特别适用于代码自动化生成的场合。&lt;br /&gt;&lt;br /&gt;感谢 Walter Bright 的杰出工作！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-117081864813158247?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/117081864813158247/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=117081864813158247&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/117081864813158247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/117081864813158247'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/dcool.html' title='D语言最Cool特性'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-117074747703221314</id><published>2007-02-05T23:37:00.000-08:00</published><updated>2007-02-05T23:37:57.296-08:00</updated><title type='text'>想写点什么</title><content type='html'>好久没跟新了，想写点什么，却又不知道该写什么......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-117074747703221314?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/117074747703221314/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=117074747703221314&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/117074747703221314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/117074747703221314'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/02/blog-post.html' title='想写点什么'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116789584768469406</id><published>2007-01-03T23:30:00.000-08:00</published><updated>2007-01-03T23:30:49.690-08:00</updated><title type='text'>It's time to say goodbye</title><content type='html'>明儿个就要暂时告别Internet了，痛苦啊！！！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116789584768469406?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116789584768469406/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116789584768469406&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116789584768469406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116789584768469406'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/01/its-time-to-say-goodbye.html' title='It&apos;s time to say goodbye'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116781238178405470</id><published>2007-01-03T00:19:00.000-08:00</published><updated>2007-01-03T00:19:45.243-08:00</updated><title type='text'>现场直播：D语言编译器 DMD 1.0</title><content type='html'>在比预定的计划晚了一天后，2007/01/02 23:37（美国时间）Walter Bright 终于放出了 DMD 1.0 编译器！&lt;br /&gt;DMD 1.0 相比0.178没有什么大的变化，只是修复了若干bugs。最大的意义在于D语言的标准暂时会稳定下来，这下标准库和应用很快就会跟上了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116781238178405470?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116781238178405470/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116781238178405470&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116781238178405470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116781238178405470'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/01/d-dmd-10.html' title='现场直播：D语言编译器 DMD 1.0'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116771113026916957</id><published>2007-01-01T20:12:00.000-08:00</published><updated>2007-01-01T20:12:11.476-08:00</updated><title type='text'>D on Solidot</title><content type='html'>&lt;i&gt;"Walter Bright正在按照预先制定的计划发布&lt;a href="http://www.digitalmars.com/d/"&gt;程序设计语言D的1.0版&lt;/a&gt;。D 语言是一种系统编程语言，它综合了C和C++语言的强大和高效，将Ruby和Python这类的新语言结合在一起。特别强调了质量保证、文献、管理、可移 植性和可靠性。D语言属于静态类，直接对本地代码进行编译。本质上仍然是C语法家族成员，但更接近于C++。现在共有两类，&lt;a href="http://www.digitalmars.com/d/dcompiler.html"&gt;Digital Mars DMD&lt;/a&gt;支持Win32和x86 Linux；&lt;a href="http://dgcc.sourceforge.net/"&gt;GCC D Compiler&lt;/a&gt;支持Windows和Mac OS X。"&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116771113026916957?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116771113026916957/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116771113026916957&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116771113026916957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116771113026916957'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2007/01/d-on-solidot.html' title='D on Solidot'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116753879563005470</id><published>2006-12-30T20:17:00.000-08:00</published><updated>2006-12-30T20:19:55.706-08:00</updated><title type='text'>新年献辞</title><content type='html'>南方周末99新年献辞&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;               总有一种力量让我们泪流满面……&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;　　               &lt;br /&gt;                    作者：江艺平&lt;br /&gt;　　&lt;br /&gt;  这是新年的第一天。这是我们与你见面的第７７７次。祝愿阳光打在你的脸上。&lt;br /&gt;　　&lt;br /&gt;  阳光打在你的脸上，温暖留在我们心里。这是冬天里平常的一天。北方的树叶已经落尽，南方的树叶还留在枝上，人们在大街上懒洋洋地走着，或者急匆匆地跑着，每个人都怀着自己的希望，每个人都握紧自己的心事。&lt;br /&gt;　　&lt;br /&gt;  本世纪最后的日历正在一页页减去，没有什么可以把人轻易打动。除了真实。人们有理想但也有幻象，人们得到过安慰也蒙受过羞辱，人们曾经不再相信别人也不再相信自己。好在岁月让我们深知“真”的宝贵——真实、真情、真理，它让我们离开凌空蹈虚的乌托邦险境，认清了虚伪和欺骗。尽管，“真实”有时让人难堪，但直面真实的民族是成熟的民族，直面真实的人群是坚强的人群。&lt;br /&gt;&lt;br /&gt;　　没有什么可以轻易把人打动，除了正义的号角。当你面对蒙冤无助的弱者，当你面对专横跋扈的恶人，当你面对足以影响人们一生的社会不公，你就明白正义需要多少代价，正义需要多少勇气。&lt;br /&gt;&lt;br /&gt;　　没有什么可以轻易把人打动，除了内心的爱。没有什么可以轻易把人打动，除了前进的脚步……&lt;br /&gt;&lt;br /&gt;　　这是新年的第一天，就像平常一样，我们与你再次见面，为逝去的一年而感怀，为新来的一年作准备。祝愿阳光打在你的脸上。&lt;br /&gt;&lt;br /&gt;　　阳光打在你的脸上，温暖留在我们心里。有一种力量，正从你的指尖悄悄袭来，有一种关怀，正从你的眼中轻轻放出。在这个时刻，我们无言以对，惟有祝福：让无力者有力，让悲观者前行，让往前走的继续走，让幸福的人儿更幸福；而我们，则不停为你加油。&lt;br /&gt;&lt;br /&gt;　　我们不停为你加油。因为你的希望就是我们的希望，因为你的苦难就是我们的苦难。我们看着你举起锄头，我们看着你舞动镰刀，我们看着你挥汗如雨，我们看着你谷满粮仓。我们看着你流离失所，我们看着你痛哭流涕，我们看着你中流击水，我们看着你重建家园。我们看着你无奈下岗，我们看着你咬紧牙关，我们看着你风雨度过，我们看着你笑逐颜开……我们看着你，我们不停为你加油，因为我们就是你们的一部分。&lt;br /&gt;&lt;br /&gt;　　总有一种力量它让我们泪流满面，总有一种力量它让我们抖擞精神，总有一种力量它驱使我们不断寻求“正义、爱心、良知”。这种力量来自于你，来自于你们中间的每一个人。&lt;br /&gt;&lt;br /&gt;　　所以，在这样的时候，在这新年的第一天，我们要向你、向你身边的每一个人，说一声，“新年好”！祝愿阳光打在你的脸上。&lt;br /&gt;&lt;br /&gt;　　因为有你，才有我们。&lt;br /&gt;&lt;br /&gt;　　阳光打在你的脸上，温暖留在我们心里。为什么我们总是眼含着泪水，因为我们爱得深沉；为什么我们总是精神抖擞，因为我们爱得深沉；为什么我们总在不断寻求，因为我们爱得深沉。爱这个国家，还有她的人民，他们善良，他们正直，他们懂得互相关怀。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116753879563005470?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116753879563005470/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116753879563005470&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116753879563005470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116753879563005470'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/12/blog-post_30.html' title='新年献辞'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116745363706819574</id><published>2006-12-29T20:34:00.000-08:00</published><updated>2006-12-29T20:44:54.120-08:00</updated><title type='text'>最好的新年礼物</title><content type='html'>老萨今天早上被处死了！今天是全世界所有自由人的节日！&lt;br /&gt;&lt;br /&gt;转贴：新史记西域列传之&lt;br /&gt;萨达姆评传&lt;br /&gt;作者：&lt;span style="color: rgb(125, 125, 125);"&gt;饕餮&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   国朝五十七年秋十一月，伊拉克前国君萨达姆氏以绞监候罪决，拟于冬月付绞刑焉。余党则圈禁问斩有差。当是时也，我朝京师举盛宴以飧非洲列国，酋长并元首举杯，旧债变新钱无算。而应和萨氏之悲鸣者，仅得坊间抽泣之哀哀也。&lt;br /&gt;&lt;br /&gt;   盖萨达姆氏，西域之枭雄也。民国二十六（1937）诞于沙漠之边鄙。以西人俗例，应金牛之座；依我朝命理，归丑牛之属。则金牛星座有杀伐之象，丑牛属相含 孤愤之形。未诞之初，先有父兄之丧；煞星既出，生身之母亦嫌。幼孤贫，叔父养，寡言少爱，敏聪多疑。弱冠入复兴之党，二十杀亲姐之夫。与党人共铁血之命 运，三弑君以不遂而逃亡。我朝文革之期，萨氏建功之日。国朝三十年，（1979）萨氏登基，南面之初，屠戮异己，同党授首，朝野股栗。登基年余，伐波斯。 八年血战，百万生灵涂炭；两伊争锋，真主无奈兵霾。穷兵黩武，西域列国厌其暴；独裁治国，什叶逊尼恐其威。国朝四十一年（1990），凌暴弱国科威特，米 英二国大怒，兴义师痛击之，解科威特之倒悬于三日之内。萨氏败归，阴啣其恨，遂与米英结仇也。&lt;br /&gt;&lt;br /&gt;   继之，米英挟联合国以凌萨氏，萨氏则扬言将以巨弹飱二国焉。国朝五十二年（2001）米国果遭恐怖巨创，颇疑萨氏所为，使联合国数责之，萨氏强项与争，逞 口舌之快，赞恐怖之军，屠异见之族，鼓圣战之舌，而不知大祸之将临也。国朝五十四年春三月，米国率联军挺进沙漠，铁甲滚滚荡涤，飞鹰翩翩笼罩，我朝张将军 愕愕，宣谕台泄泄，水主持哀哀，而义师已得伊国焉。人民箪壶琼浆以迎，暴君威烈雕像竟崩。萨氏潜匿，宫阙一空。继之，义师毙太子，擒大臣，终乃掘洞穴而擒 萨氏焉。萨氏之朝遂亡。&lt;br /&gt;&lt;br /&gt;   论者曰：米英伐伊拉克，毁萨氏王朝，无非图伊国石油之利，小布什有栽赃之嫌，萨达姆有英雄之冠。余则谓：以有道伐无道，得其利者，固也；以文明毁残暴，应 天时者，然也。萨氏乃西域之独夫，中东之枭雄，文明之毒痈，民主之大害。是以萨氏之灭，天下大快。物伤其类者，独不惧人神共愤乎？萨氏灭，独夫恐，匪类 哀，我朝亦有愤者同悲也。是以萨氏赴黄泉之日，当感念此辈之祭送焉。&lt;br /&gt;   是为记。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116745363706819574?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116745363706819574/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116745363706819574&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116745363706819574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116745363706819574'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/12/blog-post_29.html' title='最好的新年礼物'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116593620768920680</id><published>2006-12-12T07:10:00.000-08:00</published><updated>2006-12-12T07:10:07.906-08:00</updated><title type='text'>老革命的浅影</title><content type='html'>最近 C++ 大牛 Andrei Alexandrescu 频繁现身D语言新闻组，看来D的前途一片光明啊。咋们菜鸟么就等1月一号的1.0了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116593620768920680?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116593620768920680/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116593620768920680&amp;isPopup=true' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116593620768920680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116593620768920680'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/12/blog-post_12.html' title='老革命的浅影'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116593228443861552</id><published>2006-12-12T05:58:00.000-08:00</published><updated>2006-12-12T06:04:44.610-08:00</updated><title type='text'>Wine&amp;&amp; Diablo2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/7630/4023/1600/322973/Screenshot.png"&gt;Fedora 6　下面运行　Diablo2 ，哈哈：&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/7630/4023/1600/322973/Screenshot.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger/7630/4023/320/171214/Screenshot.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116593228443861552?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116593228443861552/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116593228443861552&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116593228443861552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116593228443861552'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/12/wine-diablo2.html' title='Wine&amp;&amp; Diablo2'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116584102298109580</id><published>2006-12-11T04:43:00.000-08:00</published><updated>2006-12-11T04:43:49.340-08:00</updated><title type='text'>老革命的浅影</title><content type='html'>昨天第一次给 DigitalMars 报告bug，没想到竟然有人比我快。。。。&lt;br /&gt;不管怎么说，也算是为 D语言的发展作了一丁点贡献，呵呵，希望我能见证历史。。。。。&lt;br /&gt;具体来说，这个bug是#635, 当创建内嵌类对象时编译器将陷入死循环：&lt;br /&gt;&lt;a href="http://d.puremagic.com/issues/show_bug.cgi?id=635"&gt;http://d.puremagic.com/issues/show_bug.cgi?id=635&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116584102298109580?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116584102298109580/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116584102298109580&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116584102298109580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116584102298109580'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/12/blog-post_11.html' title='老革命的浅影'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116498548895501300</id><published>2006-12-01T07:04:00.000-08:00</published><updated>2006-12-01T07:04:49.116-08:00</updated><title type='text'>开源可乐</title><content type='html'>&lt;a href="http://www.opencola.org/"&gt;http://www.opencola.org/&lt;/a&gt;，企图用Open Source 协作的方式实验出 Cocacola和pepsi 的绝密配方。不知道这算不算恶搞？因为这个网站被 Great Firewall “河蟹”掉了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116498548895501300?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116498548895501300/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116498548895501300&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116498548895501300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116498548895501300'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/12/blog-post.html' title='开源可乐'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116487252414213353</id><published>2006-11-29T23:42:00.000-08:00</published><updated>2006-11-29T23:42:04.600-08:00</updated><title type='text'>hack scons使用新版DMD编译器链接出错的bug</title><content type='html'>scons目前的版本在构建D语言项目时默认没有链接数学库，导致gcc链接出错。对于这个问题，可以通过修改 scons/tool/dmd.py 文件，解决，具体就是在&lt;br /&gt;                    if 'pthread' not in libs:&lt;br /&gt;                        env.Append(LIBS = ['pthread'])&lt;br /&gt;后面加入&lt;br /&gt;                    if 'm' not in libs:&lt;br /&gt;                        env.Append(LIBS = ['m'])&lt;br /&gt;&lt;br /&gt;此方法在Fedora6 下测试通过。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116487252414213353?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116487252414213353/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116487252414213353&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116487252414213353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116487252414213353'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/hack-sconsdmdbug.html' title='hack scons使用新版DMD编译器链接出错的bug'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116486918936037676</id><published>2006-11-29T22:46:00.000-08:00</published><updated>2006-11-29T22:46:30.903-08:00</updated><title type='text'>日本人爱D语言</title><content type='html'>我注意到D语言邮件列表里有很多日本的爱好者在活动，是不是他们想抓住这个机会站在更高的起跑线上一举超过美国？难道制造业的历史又要重演？&lt;br /&gt;不管怎么说，支持的人越多对D语言的发展越有利，我都等不及了！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116486918936037676?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116486918936037676/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116486918936037676&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116486918936037676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116486918936037676'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/d.html' title='日本人爱D语言'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116472899055330263</id><published>2006-11-28T07:49:00.000-08:00</published><updated>2006-11-28T07:49:55.786-08:00</updated><title type='text'>老革命的浅影</title><content type='html'>&lt;a href="http://oldrev.blogspot.com/"&gt;这里 http://bulk.fefe.de/scalability/&lt;/a&gt; 有一个对 Linux 2.4/2.6, NetBSD 1.6.1, OpenBSD 3.4, FreeBSD 5.1 内核的基准测试，虽然这几个内核的版本比较老，但测试结果具有很高的参考价值。&lt;br /&gt;测试结果很有趣，综合来看，Linux 2.6 和 FreeBSD 的性能最好，FreeBSD 在网络方面更加突出。令人惊奇的是，有些测试项目各个内核的时间复杂度差异非常巨大，竟然同时包含O(1)和O(n)！&lt;br /&gt;NetBSD 和 OpenBSD 只是在个别项目中表现突出，看来他们还有很长的路要走......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116472899055330263?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116472899055330263/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116472899055330263&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116472899055330263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116472899055330263'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/blog-post_28.html' title='老革命的浅影'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116447243599824766</id><published>2006-11-25T08:33:00.000-08:00</published><updated>2006-11-25T08:33:56.420-08:00</updated><title type='text'>[转贴]爱因斯坦、牛顿、达尔文投胎中国后</title><content type='html'>&lt;b&gt;[转贴]爱因斯坦、牛顿、达尔文投胎中国后&lt;/b&gt;&lt;br /&gt;&lt;span style="color:#7d7d7d;"&gt;文章提交者：猫眼游客 加帖在 &lt;a href="http://club.cat898.com/newbbs/list.asp?boardid=1" _base_target="_self"&gt;猫眼看人&lt;/a&gt; 【凯迪网络】 http://www.kdnet.net&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; 上帝听说有十三亿人口的中国一直没有一个本土的诺贝尔奖得主后，感到实在过意不去，决定帮一下中国，于是到天堂名人厅召开动员会议，让爱因斯坦、爱迪生、牛顿、达尔文、孟德尔等天才投胎中国大陆。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　 　爱因斯坦最先来到人世，他降生在一位国家科学院院士的家中，父母都是饱读诗书的中国学者，小爱因斯坦从小很喜欢幻想，除了爱学自己喜欢的，其他学习成绩 却很差。中学没有毕业，已经10次补考，被学校退学3次，父母带他到北京大学人民医院检查，医生经过会诊认为他有妄想症，智商只有常人的60%，于是爱因 斯坦被送进一家弱智群体学校，父母想到自己的孩子如此弱智，感到不可理解；作为中科院院士，他的父亲便怀疑他老婆偷人，两口子吵架101次，后来离婚。小 爱因斯坦被判给他母亲，母亲想让他学习一点其他的东西，培养一些特长，便教他音乐，谁知爱因斯坦对音乐兴趣不大，只喜欢随便拉两下小提琴，却不肯去考级。 对绘画也没有兴趣，成天胡思乱想，考虑过去未来、质量能量的关系，认为时间和空间是有联系的。一个小孩子，有这种思想，当然最后会被送进精神病医院。对于 这个罕见的病例，医院成立了专门研究小组，并申请了国家\"863\"计划的专项基金，由著名海归学者领军，他们认为对\"爱因斯坦综合症\"这种罕见的 精神病的研究大大提升了人类对自然的认识！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　爱迪生随即诞生了，他天资聪明，数理化从小学到高中都是第一名，可 是对外语不喜欢，便没有考上大学，父母没钱送他出国，只好招工进入一家灯泡厂做了一名工人，爱迪生对灯泡特别感兴趣，但是公司没实力为他提供一间实验室研 究新产品，认为他一个大学都没上过的人，还想做研发，实在搞笑。只是派他做了一名卖灯泡的业务员，好在他最后快乐的找了一个老婆，并生了一个儿子！过着幸 福的平常人的生活！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　达尔文接着来到这个历史悠久的古国，小时一直比较顺利，高中时对地理和生物特别感兴趣，但 在中国高中，2年级时分文理科，地理分在文科班，生物分在理科班，他过于固执，最后考入一所旅游学校，期望成为一名导游，周游列国，但是，旅游专业毕业 的，没有高学历，被人认为是混文凭，经努力探索，终于发现人是由古猿演化而来的！周围无不危言耸听，他却不听从老同志劝告，坚持己见，上面来人了，他还蒙 在鼓里，组织上说制造\"猴子\"谣言是犯罪的。 因为和政府不能保持一直，政治立场可疑，被定位为造谣，有\"扰乱社会治安\"企图！ 被送进劳教所接受劳动人民的再教育！出来后送到矿山，成为一名光荣的矿工！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　孟德尔自小是一位农民，上不起大 学，留在家种地，种了一大片豌豆，他从豌豆的长势种发现一种叫\"基因\"的可遗传物质，从此激发培养一种优良豌豆的兴趣，他的豌豆产量比其他人高出好几 倍。但是他自己没有上过大学，没有文凭，没有导师推荐，交不起版面费，写的文章也没有人看，没有单位敢出版，只好把自己的种豌豆的经验写下来，到处请专家 鉴定，被中科院农业专家权威学者认为是一种伪科学。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　好在，当时袁隆平正好为杂交水稻的问题而苦恼，常常亲 临一线，无意中走到孟德尔豌豆地，发现他地豌豆很特别，便向这个老实巴交的农民请教，并和他同吃同住，孟德尔便把自己的看法说了，对袁隆平有很大的启发。 袁隆平曾在联合国大会发言时说：我是一个农民。农民是我的老师，我的一切灵感来源于农民！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　孟德尔的豌豆虽好，却卖不出去，白条子受不了，农民负担太重，实验田动辄被强制征收，乡镇要吸引外资，搞配套工程，建高尔夫球场。不要说科学研究，肚子都成问题，随着改革开放，无奈！随同乡一起南下打工，成为一名打工仔！现在东莞一家村办企业打工，至今未婚！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　 　牛顿说来运气最好。 他成绩很好，由于脾气古怪，高中老师在档案中给了较多负面评语，结果高考调档时被某著名大学老师认为思想品德不好，政治不可靠，档案被退回，只考上一所大 学无锡某职业技术学院物理专业，写了一大堆关于经典力学的论文并提出了新的学说，但是由于导师不愿看到自己的弟子远远超过自己，自己在他面前，就像白痴， 没有向杂志推荐，被退稿；而且导师很少指导他，忙着发文章、评职称、弄经费、申报成果，牛顿写的文章全无章法，不符合排版要求，只是依稀象个样子！曾自费 参加在广西北海的学术交流，当时有国家的几位院士在座，牛顿想这是一个好机会，便向几位院士请教。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　问题一出，他说的问题几位院士前所未闻！牛顿性格的确不好，有一些着急便说到：难道科学院是养猪场不成！牛顿立即被轰出会场！从此天下再没有一家杂志社敢发牛顿的文章！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　牛顿一生只在无锡职业技术学院的发表过一片当时被万人耻笑的万有引力的短讯！后半生，一直在当了物理老师，总算干了老本行。比前几位强。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　几位投胎转世都没有什么结果，上帝有一些着急了！正好看见门捷列夫在名人厅俱乐部角落里摆弄元素周期表的扑克牌。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　上帝问：小门啊，你愿意帮助一下中国吗！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　门捷列夫说：我很愿意去中国看一看！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　上帝问：你需要什么样的条件呢！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　小门说：前几位没有成功可能是因为没有念太多书的原故，特别是没有留过洋镀金，机会也少许多！根据我考察，在中国，至少要读到博士吧，最好还是海归，否者根本没人理你，最好出生在家庭条件较好的,最好还能出国留学！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　上帝说：最后的不行，我要帮助中国实现本土培养的科学家获奖的目的，人家印度为什么可以有自己培养的拉曼，中国人也应当，有什么其它要求随时和我联系！我的小灵通：7057109 （肯定能拨通！）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　　　门捷列扶说：我一定！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　小门出生于一个教育家的家庭，受良好的教育，并且考上了中国中央大学的化学博士，分在国家中心实验室工作，他的导师（中科院资深院士）承担国家重点项目。有充足的科研经费，小门也很回来事，和导师关系很好！。。。。。。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　 　毕竟是门捷列夫转世，他很争气，名气很快超过了导师，将元素周期表编到第188个，然而要在实验中求证并不容易，可是实验室管理员来自老区和上面安插的 人员，文化程度很低，只有小学水平，却很有自己的一套，自己不会，也不虚心学习。却牛的不得了！实验要求的蒸馏水都跑断腿，磨破嘴，什么事情都要小门自己 做。在加上国家博士扩招，每一个星期小门才轮到一次做实验，遇上实验员去打麻将去了，党员学习都只能放弃！另外，由于锋芒太露，导师对自己也开始有点那 个，加上没有海外留学绿騀！ 又是址读，无法申请经费。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　于是小门通过太空长途电话联系到上帝：上帝啊，我现在需要一个实验室！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　上帝说：好啊，需要什么样的条件，小门列出了一个名系单，上帝皱了一下眉：哎呀，太专业了。这些我也不懂，你自己联系购买吧，我在瑞士银行给你存了一笔钱，自己去取吧！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　小门很高兴，次日向瑞士银行联系，果然有一笔！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　通过正常渠道获得外汇和购买设备，要通过科技部、教育部、财政部、外贸部，外汇管理局！小门费了不少脑筋，总算买到些东西 ！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　小门又问上帝：不行啊，不好使！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　上帝说：我有一些熟人，你找他们联系吧！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　小门与欧洲科学院联系建立一家大型实验室，供货商也联系好了，一批犹太科学家鼎力支持，科研设备全是最先进的！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　 　千心万苦地挫败欧美反华势力的科技禁运，科研设备购置齐全，装船运抵中国，通过马六甲海峡时，爱国商人李嘉诚听说是为提高中国科学进步的货船，免费提供 了大量帮助，隆重招待了亲自押船的门捷列夫，称赞他年轻有为，将来一定能成为伟大的科学家，并表示：可以为小门提供一切力所能及的帮助，小门感激的落泪！ 表示一定不辜负李先生的期望?为中国人争气！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;    门捷列夫大出风头，引起国内知识界的普遍不满，两院一致认为，小门爱出风头，不守纪律擅自行动，目无组织，表示永远不吸纳此人为院士。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     小门自费购买科研设备的行为引起检查部门的注意，一上岸即被隔离审查，由于说不清巨款来源，被判\"巨额财产来历不明罪\"锒铛入狱！而小门千心万苦运回 的大批顶级科研设备（因该批设备顺利运抵中国，美国专家认为这批设备可提高中国科技水平20-50年，由于海军和特工拦截不利，美海军总司令、中情局局长 等引咎辞职，总统也被弹劾），国内专家都无法操作，连组装都做不了，打报告给上头，说是一船电子垃圾，毫无价值而且会污染环境，最终被拍卖拆卸分类处理， 钢铁部分拨给宝钢冶炼钢材，据说这批\"废料\"炼出的冷扎板质量最好！&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;　　话说上帝很久不见小门很是挂念，费劲心思找到他，被小门一通臭骂：臭上帝，害死老子了！小门窝了一肚子火，却无从发泄，一气之下，栓了一根绳子在梁上，去见上上帝。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116447243599824766?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116447243599824766/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116447243599824766&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116447243599824766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116447243599824766'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/blog-post_25.html' title='[转贴]爱因斯坦、牛顿、达尔文投胎中国后'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116444390332770727</id><published>2006-11-25T00:10:00.000-08:00</published><updated>2006-11-25T00:40:34.480-08:00</updated><title type='text'>Fedora Core6 中文美化</title><content type='html'>&lt;style&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }   H2 { margin-bottom: 0.21cm }   H2.western { font-family: "SimSun", serif }   H2.cjk { font-family: "SimSun"; font-style: normal }   H2.ctl { font-family: "Tahoma" }  --&gt;  &lt;/style&gt;  &lt;p&gt;&lt;span style="font-family:SimSun,serif;"&gt;Fedora6 &lt;/span&gt;自带的字体没有文泉驿的好看（个人认为），而且当你在 &lt;span style="font-family:SimSun,serif;"&gt;FC6 &lt;/span&gt;中使用 &lt;span style="font-family:SimSun,serif;"&gt;Windows &lt;/span&gt;的字体时，宋体小字体会发虚。最不能容忍的是 &lt;span style="font-family:SimSun,serif;"&gt;FC6 &lt;/span&gt;附带的浏览器居然是 &lt;span style="font-family:SimSun,serif;"&gt;Firefox 1.5&lt;/span&gt;，如果你使用 &lt;span style="font-family:SimSun,serif;"&gt;mozilla.org &lt;/span&gt;官方下载的 &lt;span style="font-family:SimSun,serif;"&gt;firefox2 &lt;/span&gt;就会发现它的界面和&lt;span style="font-family:SimSun,serif;"&gt;html&lt;/span&gt;字体也都跟着发虚，实在是惨不忍睹。&lt;/p&gt; &lt;p&gt;为了让 &lt;span style="font-family:SimSun,serif;"&gt;FC6 &lt;/span&gt;顺眼一点，我把用于 &lt;span style="font-family:SimSun,serif;"&gt;ubuntu &lt;/span&gt;的 &lt;span style="font-family:SimSun,serif;"&gt;WQY+MS-Font &lt;/span&gt;美化的办法 &lt;span style="font-family:SimSun,serif;"&gt;port &lt;/span&gt;到了 &lt;span style="font-family:SimSun,serif;"&gt;FC6&lt;/span&gt;，效果还算不错，故而特别在 &lt;span style="font-family:SimSun,serif;"&gt;blog &lt;/span&gt;上贴出来作个记录。&lt;/p&gt; &lt;h2 class="cjk"&gt;&lt;span style="font-family:SimSun,serif;"&gt;1.&lt;/span&gt;安装 &lt;span style="font-family:SimSun,serif;"&gt;WQY &lt;/span&gt;字体&lt;/h2&gt; &lt;p&gt;&lt;span style="font-family:SimSun,serif;"&gt;WQY &lt;/span&gt;字体到 &lt;span style="font-family:SimSun,serif;"&gt;http://wenq.org/ &lt;/span&gt;下载，并按其文档说的方法安装。需要注意的是需要系统中有 &lt;span style="font-family:SimSun,serif;"&gt;make &lt;/span&gt;程序。&lt;/p&gt; &lt;h2 class="cjk"&gt;&lt;span style="font-family:SimSun,serif;"&gt;2. &lt;/span&gt;配置&lt;span style="font-family:SimSun,serif;"&gt;fontconfig&lt;/span&gt;&lt;/h2&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;#cd /etc/fonts/&lt;br /&gt;#cp -r conf.d conf.d.bak&lt;br /&gt;#cd conf.d&lt;br /&gt;#rm 64-nonlatin-fedora.conf&lt;br /&gt;#rm 25-no-hint-fedora.conf &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;用文本编辑器创建 &lt;span style="font-family:SimSun,serif;"&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;/etc/fonts/conf.d/50-xfonts-wqy.conf&lt;/span&gt; &lt;/span&gt;文件，并加入一下内容：&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;&lt;selectfont&gt;&lt;/selectfont&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;span style="font-family:SimSun,serif;"&gt;&lt;acceptfont&gt;&lt;/acceptfont&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;    &lt;span style="font-family:SimSun,serif;"&gt;&lt;pattern&gt;&lt;/pattern&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;      &lt;span style="font-family:SimSun,serif;"&gt;&lt;patelt name="family"&gt;&lt;string&gt;WenQuanYi Bitmap Song&lt;/string&gt;&lt;/patelt&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;    &lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;在 &lt;span style="font-family:SimSun,serif;"&gt;/etc/fonts/conf.d/&lt;/span&gt;创建 &lt;span style="font-family:SimSun,serif;"&gt;50-chinese.conf &lt;/span&gt;文件并输入一下内容：&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;&lt;fontconfig&gt;&lt;/fontconfig&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;alias&gt;&lt;/alias&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;serif&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;prefer&gt;&lt;/prefer&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;   &lt;family&gt;DejaVu Serif&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;   &lt;family&gt;Bitstream Vera Serif&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;   &lt;family&gt;WenQuanYi Bitmap Song&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;   &lt;family&gt;SimSun&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;   &lt;family&gt;AR PL ShanHeiSun Uni&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;   &lt;family&gt;AR PL ZenKai Uni&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;alias&gt;&lt;/alias&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;sans-serif&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;prefer&gt;&lt;/prefer&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;DejaVu Sans&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;Bitstream Vera Sans&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;WenQuanYi Bitmap Song&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;SimSun&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;AR PL ShanHeiSun Uni&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;AR PL ZenKai Uni&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;alias&gt;&lt;/alias&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;monospace&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;prefer&gt;&lt;/prefer&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;Bitstream Vera Sans Mono&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;DejaVu Sans Mono&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;SimSun&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;AR PL ShanHeiSun Uni&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;WenQuanYi Bitmap Song&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;family&gt;AR PL ZenKai Uni&lt;/family&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;match target="font"&gt;&lt;/match&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;test name="family" compare="contains"&gt;&lt;/test&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Song&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Sun&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Kai&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Ming&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;!-- check to see if the font is just regular --&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;test name="weight" compare="less_eq"&gt;&lt;/test&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;int&gt;100&lt;/int&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;test compare="more_eq" target="pattern" name="weight"&gt;&lt;/test&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;int&gt;180&lt;/int&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;edit mode="assign" name="embolden"&gt;&lt;/edit&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;bool&gt;true&lt;/bool&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;match target="font"&gt;&lt;/match&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;test name="family" compare="contains"&gt;&lt;/test&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Song&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Sun&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Kai&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;Ming&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;宋体&lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;宋体&lt;span style="font-family:SimSun,serif;"&gt;-18030&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;黑体&lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;新宋体&lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;新宋体&lt;span style="font-family:SimSun,serif;"&gt;-18030&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;楷体&lt;span style="font-family:SimSun,serif;"&gt;_GB2312&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;仿宋&lt;span style="font-family:SimSun,serif;"&gt;_GB2312&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;&lt;/string&gt;&lt;/span&gt;隶体&lt;span style="font-family:SimSun,serif;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;SimSun&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;SimSun-18030&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;SimHei&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;NSimSun&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;NSimSun-18030&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;KaiTi_GB2312&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;FangSong_GB2312&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;string&gt;LiSu&lt;/string&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;edit name="globaladvance"&gt;&lt;/edit&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;bool&gt;false&lt;/bool&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;edit name="spacing"&gt;&lt;/edit&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;int&gt;0&lt;/int&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;edit name="hinting"&gt;&lt;/edit&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;bool&gt;true&lt;/bool&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;edit name="autohint"&gt;&lt;/edit&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;bool&gt;false&lt;/bool&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;edit name="antialias" mode="assign"&gt;&lt;/edit&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;bool&gt;true&lt;/bool&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;test name="pixelsize" compare="more_eq"&gt;&lt;/test&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;int&gt;12&lt;/int&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;test name="pixelsize" compare="less_eq"&gt;&lt;/test&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;int&gt;24&lt;/int&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;edit name="antialias" mode="assign"&gt;&lt;/edit&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;bool&gt;false&lt;/bool&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="background: rgb(255, 255, 204) none repeat scroll 0% 50%; margin-bottom: 0cm; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-family:SimSun,serif;"&gt; &lt;/span&gt; &lt;/p&gt; &lt;h2 class="cjk"&gt;&lt;span style="font-family:SimSun,serif;"&gt;3. done&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;接下来重启&lt;span style="font-family:SimSun,serif;"&gt;X&lt;/span&gt;就搞定了，&lt;span style="font-family:SimSun,serif;"&gt;Windows &lt;/span&gt;的字体可以复制或连接到：&lt;span style="font-family:SimSun,serif;"&gt;/usr/share/fonts/chinese/TrueType &lt;/span&gt;处&lt;/p&gt; &lt;h2 class="cjk"&gt;&lt;span style="font-family:SimSun,serif;"&gt;4. show&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;我的字体效果&lt;span style="font-family:SimSun,serif;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/7630/4023/1600/758253/Screenshot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/7630/4023/400/183167/Screenshot.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116444390332770727?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116444390332770727/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116444390332770727&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116444390332770727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116444390332770727'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/fedora-core6_25.html' title='Fedora Core6 中文美化'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116419160316452576</id><published>2006-11-22T02:33:00.000-08:00</published><updated>2006-11-22T02:33:23.216-08:00</updated><title type='text'>老革命的浅影</title><content type='html'>一个冲动，真的换了 Fedora6，rh的东西麻烦啊，到现在MP3还是放不了。我就弄不明白，企业版卖那么贵的红帽子居然舍不得花钱买个MP3专利使用授权......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116419160316452576?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116419160316452576/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116419160316452576&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116419160316452576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116419160316452576'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/blog-post_22.html' title='老革命的浅影'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116409714105104821</id><published>2006-11-21T00:19:00.000-08:00</published><updated>2006-11-21T00:19:02.706-08:00</updated><title type='text'>考虑换 Fedora Core6</title><content type='html'>Ubuntu 的汉化实在是太夸张了，不知道是不是用的机器翻译，Gnucash 的 Increase 给翻成“增加字体大小”.....&lt;br /&gt;于是乎正在考虑是不是枪毙ubuntu换fc6&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116409714105104821?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116409714105104821/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116409714105104821&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116409714105104821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116409714105104821'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/fedora-core6.html' title='考虑换 Fedora Core6'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116402990830286524</id><published>2006-11-20T05:38:00.000-08:00</published><updated>2006-11-20T05:38:28.486-08:00</updated><title type='text'>老革命的浅影</title><content type='html'>&lt;a href="http://oldrev.blogspot.com/"&gt;老革命的浅影&lt;/a&gt;&lt;br /&gt;又能用了，留个爪印&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116402990830286524?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116402990830286524/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116402990830286524&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116402990830286524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116402990830286524'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/blog-post_20.html' title='老革命的浅影'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116314015509621835</id><published>2006-11-09T22:23:00.000-08:00</published><updated>2006-11-10T01:19:11.560-08:00</updated><title type='text'>D语言 1.0 新年出笼！</title><content type='html'>在 digitalmars.d.announce 新闻组上，Walter Bright 老大放话说预定 Jan 1 2007 放出 D 1.0 Spec！真是值得高兴的新闻，这下有了一个固定的标准，那些 dsource.org 的项目也应该可以继续了。真的很希望 DM 的这个举动能引起巨头们的注意，进一步成为国际标准，成为21世纪的编程语言。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116314015509621835?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116314015509621835/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116314015509621835&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116314015509621835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116314015509621835'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/d-10.html' title='D语言 1.0 新年出笼！'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116313971299853717</id><published>2006-11-09T22:21:00.000-08:00</published><updated>2006-11-09T22:21:53.026-08:00</updated><title type='text'>老革命的浅影</title><content type='html'>&lt;a href="http://oldrev.blogspot.com/"&gt;老革命的浅影&lt;/a&gt;&lt;br /&gt;怎么回事？Blogger 又给解封了？这下真老夫感动得想哭啊，诚惶诚恐的。&lt;br /&gt;千言万语汇成一句话：谢主隆恩！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116313971299853717?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116313971299853717/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116313971299853717&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116313971299853717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116313971299853717'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/11/blog-post.html' title='老革命的浅影'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116175461835267122</id><published>2006-10-24T22:36:00.000-07:00</published><updated>2006-10-24T22:36:58.376-07:00</updated><title type='text'>Language Machine</title><content type='html'>&lt;p&gt;Language Machine 是一个用D语言实现的所谓元语言（metalanguage）编译器，类似于Yacc之类，采用一种很像EBNF的语法能将一种语言源程序直接转换为另一种语言。最cool的是里面已经包含了一个叫j2d的范例可以将Java转换为D语言，据说转换5000多个文件的 GNU Classpath都没问题！老夫姑且信之，待熟悉之后再试验。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;LM网站：&lt;/p&gt; &lt;p&gt;&lt;a href="http://languagemachine.sf.net"&gt;http://languagemachine.sf.net&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116175461835267122?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116175461835267122/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116175461835267122&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116175461835267122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116175461835267122'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/language-machine.html' title='Language Machine'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116144653911411522</id><published>2006-10-21T09:02:00.000-07:00</published><updated>2006-10-21T09:02:19.146-07:00</updated><title type='text'>超强C程序</title><content type='html'>额滴神阿，天下竟然有如此强的C程序，据说是用于计算pi的值，当然我可是看不懂这样的天书，也就无从证实了。&lt;br /&gt;我在 gcc4 下测试了一下，真的可以编译通过，程序的运行结果是 0.250。&lt;br /&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt; 1 &lt;/font&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt; 2 &lt;/font&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt; 3 &lt;/font&gt;&lt;font color="#a020f0"&gt;#define _ -F&amp;lt;&lt;/font&gt;&lt;font color="#a020f0"&gt;0&lt;/font&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;&lt;font color="#a020f0"&gt;||--F-OO--;&lt;/font&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt; 4 &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; F=&lt;font color="#a020f0"&gt;0&lt;/font&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;,OO=&lt;font color="#a020f0"&gt;0&lt;/font&gt;&lt;font color="#ff00ff"&gt;0&lt;/font&gt;;main(){F_OO();printf(&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;%1.3f&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;4.&lt;/font&gt;*-F/OO/OO);}F_OO()&lt;br /&gt;&lt;font color="#a52a2a"&gt; 5 &lt;/font&gt;{&lt;br /&gt;&lt;font color="#a52a2a"&gt; 6 &lt;/font&gt;            _-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt; 7 &lt;/font&gt;       _-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt; 8 &lt;/font&gt;    _-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt; 9 &lt;/font&gt;  _-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;10 &lt;/font&gt; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;11 &lt;/font&gt; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;12 &lt;/font&gt;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;13 &lt;/font&gt;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;14 &lt;/font&gt;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;15 &lt;/font&gt;_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;16 &lt;/font&gt; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;17 &lt;/font&gt; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;18 &lt;/font&gt;  _-_-_-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;19 &lt;/font&gt;    _-_-_-_-_-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;20 &lt;/font&gt;        _-_-_-_-_-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;21 &lt;/font&gt;            _-_-_-_&lt;br /&gt;&lt;font color="#a52a2a"&gt;22 &lt;/font&gt;}&lt;br /&gt;&lt;font color="#a52a2a"&gt;23 &lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116144653911411522?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116144653911411522/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116144653911411522&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116144653911411522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116144653911411522'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/c.html' title='超强C程序'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116142263806985685</id><published>2006-10-21T02:17:00.000-07:00</published><updated>2006-10-21T02:23:58.076-07:00</updated><title type='text'>Ubuntu 又死了！</title><content type='html'>今天真幸运阿！Ubuntu 一次意外断电，经过 fsck 的妙手回春，造成了两个 ext3 分区丢失......&lt;br /&gt;我现在想起来都还有点后怕，不过幸好ntfs分区没问题。&lt;br /&gt;重装的时候我选择了JFS文件系统，估计IBM的东西应该可靠一点。下面就是新装好的 Ubuntu Edgy 截图：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7630/4023/1600/ss.1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/7630/4023/320/ss.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116142263806985685?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116142263806985685/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116142263806985685&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116142263806985685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116142263806985685'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/ubuntu.html' title='Ubuntu 又死了！'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116136886054855082</id><published>2006-10-20T11:27:00.000-07:00</published><updated>2006-10-20T11:27:42.180-07:00</updated><title type='text'>补遗：C++ 实现的 Duff's Device</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;Duff's Device是一个加速循环语句的C编码技巧。其基本思想是，如果在一个for循环中，其中操作执行得如果足够快（比如说，嗯，一个赋值）——那么测试循环条件（上面例1中是beg != end）占用了循环所用时间的很大部分。循环应该被部分解开，这样数个操作一次完成，测试操作也做的较少。比如，如果你填充一个对象区间，你可能要在一次循环中赋二个或更多连续对象的值。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;你必须注意终止条件的细节及其他。在这里Duff's Device是个新颖的，有创造力的解决方案。我们来很快地看一个基于Duff's Device的泛型填充算法的实现。 &lt;br&gt;template &amp;lt;class T&amp;gt; inline void FillDuff&lt;br&gt;&amp;nbsp;(T* begin, T* end, const T&amp;amp; obj)&lt;br&gt;{&lt;br&gt;&amp;nbsp;switch ((end – begin)&amp;nbsp;&amp;amp; 7)&lt;br&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp;case 0:&lt;br&gt;&amp;nbsp;&amp;nbsp;while (begin != end)&lt;br&gt;&amp;nbsp;&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*begin = obj; ++begin;&lt;br&gt;&amp;nbsp;case 7:&amp;nbsp;*begin = obj; ++ begin;&lt;br&gt;&amp;nbsp;case 6:&amp;nbsp;*begin = obj; ++ begin;&lt;br&gt;&amp;nbsp;case 5:&amp;nbsp;*begin = obj; ++ begin;&lt;br&gt;&amp;nbsp;case 4:&amp;nbsp;*begin = obj; ++ begin;&lt;br&gt;&amp;nbsp;case 3:&amp;nbsp;*begin = obj; ++ begin; &lt;br&gt;&amp;nbsp;case 2:&amp;nbsp;*begin = obj; ++ begin;&lt;br&gt;&amp;nbsp;case 1:&amp;nbsp;*begin = obj; ++ begin;&lt;br&gt;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;}&lt;br&gt;}&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;from &lt;a href="http://www.uml.org.cn/net/200508013.htm"&gt;http://www.uml.org.cn/net/200508013.htm&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116136886054855082?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116136886054855082/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116136886054855082&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116136886054855082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116136886054855082'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/c-duffs-device.html' title='补遗：C++ 实现的 Duff&apos;s Device'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116136840523136000</id><published>2006-10-20T11:20:00.000-07:00</published><updated>2006-10-20T11:20:05.860-07:00</updated><title type='text'>D语言深入1</title><content type='html'>&lt;p&gt;今天晚上又仔细研究了一下D语言的高级特性，娘西皮，太强了！尤其是混入(mixin)，C++模版的参数化类型算什么，D能参数化符号！&lt;/p&gt; &lt;p&gt;我爱上D了....&lt;/p&gt; &lt;p&gt;template duffs_device(alias id1, alias id2, alias s)&lt;br&gt;{&lt;br&gt;void duff_loop()&lt;br&gt;{&lt;br&gt;if (id1 &amp;lt; id2)&lt;br&gt;{&lt;br&gt;typeof(id1) n = (id2 - id1 + 7) / 8;&lt;br&gt;switch ((id2 - id1) % 8)&lt;br&gt;{&lt;br&gt;case 0: do { s();&lt;br&gt;case 7: s();&lt;br&gt;case 6: s();&lt;br&gt;case 5: s();&lt;br&gt;case 4: s();&lt;br&gt;case 3: s();&lt;br&gt;case 2: s();&lt;br&gt;case 1: s();&lt;br&gt;} while (--n &amp;gt; 0);&lt;br&gt;}&lt;br&gt;}&lt;br&gt;}&lt;br&gt;} &lt;/p&gt; &lt;p&gt;void foo() { printf("foo\n"); }  &lt;p&gt;void test()&lt;br&gt;{&lt;br&gt;int i = 1;&lt;br&gt;int j = 11;  &lt;p&gt;mixin duffs_device!(i, j, delegate { foo(); } );&lt;br&gt;duff_loop(); // 执行 foo() 10 次&lt;br&gt;}&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116136840523136000?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116136840523136000/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116136840523136000&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116136840523136000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116136840523136000'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/d1.html' title='D语言深入1'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116123257435488915</id><published>2006-10-18T21:11:00.000-07:00</published><updated>2006-10-18T21:36:14.363-07:00</updated><title type='text'>XP Tango 桌面</title><content type='html'>贴一个 Windoz XP Tango Theme  的桌面根 Linux 的对比一下：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7630/4023/1600/ss.0.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/7630/4023/320/ss.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116123257435488915?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116123257435488915/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116123257435488915&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116123257435488915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116123257435488915'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/xp-tango.html' title='XP Tango 桌面'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116119637989289254</id><published>2006-10-18T11:27:00.000-07:00</published><updated>2006-10-18T11:32:59.900-07:00</updated><title type='text'>Ubuntu Dapper 桌面</title><content type='html'>Kubuntu 重装时出了问题，我又换回了Ubuntu。下面就是新鲜出炉的 Ubuntu Dapper  桌面：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7630/4023/1600/ss.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/7630/4023/400/ss.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116119637989289254?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116119637989289254/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116119637989289254&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116119637989289254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116119637989289254'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/ubuntu-dapper.html' title='Ubuntu Dapper 桌面'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116116183505708880</id><published>2006-10-18T01:57:00.000-07:00</published><updated>2006-10-18T01:57:15.060-07:00</updated><title type='text'>Kubuntu 安装程序破坏分区表！</title><content type='html'>&lt;p&gt;我的FAT32 C:竟然被Kubuntu-Desktop 6.06 的安装程序给弄没了，幸好C:上没什么数据，真是万幸啊。真是莫名其妙，按正常安装程序走一遍竟然搞坏了分区表，Ubuntu开发组该打屁股！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116116183505708880?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116116183505708880/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116116183505708880&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116116183505708880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116116183505708880'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/kubuntu.html' title='Kubuntu 安装程序破坏分区表！'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116097435929798982</id><published>2006-10-15T21:52:00.000-07:00</published><updated>2006-10-15T21:52:39.983-07:00</updated><title type='text'>老夫的预言</title><content type='html'>&lt;p&gt;这几天出现的种种迹象表明，坚冰有可能从此开始解冻，咱就等着时间来证明了。&lt;/p&gt; &lt;p&gt;口说无凭，立此为据。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116097435929798982?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116097435929798982/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116097435929798982&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116097435929798982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116097435929798982'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/blog-post_15.html' title='老夫的预言'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116092229335827621</id><published>2006-10-15T07:24:00.001-07:00</published><updated>2006-10-15T07:24:53.363-07:00</updated><title type='text'>模版 or 宏 or meta-language?</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;C++模版元编程（template meta-programming ）我总是觉得很复杂，复杂到令人恶心的程度！既然模版元编程是为了控制编译器产生代码，那为什么不直接发明一种专门与C++结合来控制C++编译器的脚本语言（或其他机制）呢？&lt;/p&gt; &lt;p&gt;这个问题现在有了初步的答案了：&lt;a href="http://www.gccxml.org"&gt;Gccxml&lt;/a&gt; 是一个开源项目，其利用&amp;nbsp;gcc C++ 编译器分析并将 C++ 程序的语法结构存储为一个XML文件，这么做是因为下游的程序解析XML文件要比解析C++源程序简单得多。比如 &lt;a href="http://www.boost.org/libs/python/pyste/"&gt;Boost.Python.Pyste&lt;/a&gt;，为了让你的类/函数等能被Python语言调用，你需要使用 Boost.Python 对你的类进行复杂的封装，但是有了 Pyste ，你只需给Pyste一个C++类的接口，它就能使用gccxml来生成对该接口进行封装的C++代码！在此处 Pyste+gccxml 同样执行了一次模版特化，只不过不是C++模版 ，而是Microsoft Word中的模版。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116092229335827621?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116092229335827621/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116092229335827621&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116092229335827621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116092229335827621'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/or-or-meta-language.html' title='模版 or 宏 or meta-language?'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116092225555788518</id><published>2006-10-15T07:24:00.000-07:00</published><updated>2006-10-15T07:24:15.563-07:00</updated><title type='text'>D语言小试</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;今天实际尝试了一下D语言，真是非常不错，除了它的类库还不完善外。尤其值得称道的是它的编译速度，远胜C#，编译巨大的项目也只是几十秒的事，实在是比C ++进步了许多，估计原因可能也是跟单根继承的体系有关。既然是单根继承，那 Mono 项目实现的 .Net Framework 类库就有可能由牛人动手给转换为D语言了。&lt;a href="http://www.dsource.org"&gt;www.dsource.org&lt;/a&gt; 上有一项目 DWT 就是把 Eclipse 的 Java SWT 类库转为D语言，cool!&lt;/p&gt; &lt;p&gt;D 语法基本跟C#相似，不过保留了强大的模版功能，也在编译时代码生成上往前迈出了一部，支持部分编译时代码，如：static if。总的说来就是C++的自然进化，或者说是Java的Native版。现在就看有没有大厂支持了，希望D能像C一样主导高性能程序的编程，因为它确实很不错。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116092225555788518?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116092225555788518/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116092225555788518&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116092225555788518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116092225555788518'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/d.html' title='D语言小试'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-36066724.post-116092208708113050</id><published>2006-10-15T07:18:00.000-07:00</published><updated>2006-10-15T07:21:27.090-07:00</updated><title type='text'>Blogger 上的 blog 正式开张！</title><content type='html'>今天下决心把 Blog 从 &lt;a href="http://malloc2.spaces.live.com/"&gt;http://malloc2.spaces.live.com/&lt;/a&gt; 转到 google blogger了，这下算彻底投入google的怀抱了。&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://malloc2.spaces.live.com/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36066724-116092208708113050?l=oldrev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oldrev.blogspot.com/feeds/116092208708113050/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=36066724&amp;postID=116092208708113050&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116092208708113050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/36066724/posts/default/116092208708113050'/><link rel='alternate' type='text/html' href='http://oldrev.blogspot.com/2006/10/blogger-blog.html' title='Blogger 上的 blog 正式开张！'/><author><name>老革命的浅影</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
