<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>老革命的浅影 - Live Free or Code Hard</title>
    <description>本博内容仅代表本人个人观点，与本人供职的公司无关。</description>
    <link>http://oldrev.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>Linq to SQL 牢骚</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/193104" style="color:red;">http://oldrev.javaeye.com/blog/193104</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近真正玩了一下下 LINQ TO SQL(LTS)，居然遇到了无数的问题，看样子 VS2008 也是为了应付市场而赶着推出的。下面就是我遇到的若干问题：</p>
<ol>
<li>最麻烦的一点，dbml 只能从数据库生成，而不能同步，那和用 MyGeneration+AR/NH 有什么区别？</li>
<li>O/R 设计器有时会用复数作集合名称，有时又不会，害得我只好用 sqlmetal.exe 在命令行里指定参数，这算怎么一回事？</li>
<li>sqlmetal.exe 不能设定 one-to-one 关联，而 O/R 设计器里却可以?</li>
<li>不能生成 many-to-many 关系，就算是程序没那么聪明，也总该给配置文件一个机会吧？为什么不能像人家 Ruby on Rails 那样智能一点点呢？</li>
<li>Order.Customer 和 Order.CustomerId 该用谁呢？</li>
<li>居然只支持 SQL Server ？！似乎有个第三方的 Linq To DB 支持其他的数据库，不过我看了一下最新的发布版才 0.16....</li>
<li>等想起来再添加....</li>
</ol>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/193104#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 21:47:10 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/193104</link>
        <guid>http://oldrev.javaeye.com/blog/193104</guid>
      </item>
          <item>
        <title>转贴：鲁迅未收入全集的文章</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/184449" style="color:red;">http://oldrev.javaeye.com/blog/184449</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          奴才最近很有些愤愤然，倒不是主人打他的缘故，反是主人被打的缘故。主人自幼习武，很有些力气，家里横行惯了，昨天上街却碰到了练家子。那人是有名的拳师，一番打斗，主人不敌，鼻青脸肿而归。<br /><br />    外面风传争执的原由，是拳师看不惯主人欺凌奴才，所以才打抱不平；但主人自己的说法，是为丽春院的头牌争风吃醋的缘故。奴才辨不清真假，但他想，就算打抱不平，也轮不到拳师，主人打奴才是家事，外人是不容干涉的。<br /><br />    晚上吃完咸菜就馒头，奴才被主人召去训话，主人说：“我搞上丽春院的头牌，于你的脸上也有风光；我脸上被打的肿包，于你脸上也大失光彩。这岂是打我一个，简直是打我们一家哩！”<br /><br />    奴才汹汹然：“是可忍，孰不可忍也！”<br /><br />    不几日，奴才打探消息，得知拳师去外地访友，家里只有一个老妈子看门，便寻摸了一根棍子，昂然前往，排闼直入，奴才面有菜色，此时却容光焕发，英气逼人，进屋拿棍一阵横扫，无论桌椅板凳，锅碗瓢盆，但凡有整个的，莫不砸个稀烂，随后大笑三声，扬长而去，临走还不忘在老妈子脸上摸了一把。<br /><br />    奴才凯旋而归，主人对他说：“你，很不错的。”<br /><br />    奴才得了嘉奖，欢喜不尽，觉得咸菜也分外香了，干活也更有劲了，逢人便说：“主人夸我呢！”<br /><br />    可惜好景不长。拳师回家后听老妈子一番哭诉，雷霆大怒，天天在家门口练拳，并放出话来，要复仇云云。奴才对拳师不以为然，主人却怕了。就骂奴才不守规矩，胡乱闯祸，骂得兴起，竟将奴才暴打一顿，关入了黑屋。随后备了上好礼物，找拳师陪罪去了。<br /><br />    奴才在黑屋里有些愕然，几乎要落下泪来，但不久也就释然了。奴才想，砸东西是应该的，但砸得太凶是不应该的，摸老妈子的脸更是可恶的；再说，主人和拳师终究还是要做朋友的，做奴才的，岂有不受点委屈的；说不定这会儿主人和拳师早已握手言和，正在一起喝花酒呢，这于自己脸上也是很有光彩的……<br /><br />    想到这里，奴才便又欣欣然了。
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/184449#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 19:09:54 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/184449</link>
        <guid>http://oldrev.javaeye.com/blog/184449</guid>
      </item>
          <item>
        <title>ZT: 一点点不河蟹的声音</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/182377" style="color:red;">http://oldrev.javaeye.com/blog/182377</a>&nbsp;
          发表时间: 2008年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载个链接，真是没有做不到，只有想不到啊：<br /><br /><a href="http://qbar.qq.com/cqhealth/3675.htm" target="_blank">http://qbar.qq.com/cqhealth/3675.htm</a>
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/182377#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Apr 2008 21:13:16 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/182377</link>
        <guid>http://oldrev.javaeye.com/blog/182377</guid>
      </item>
          <item>
        <title>一个 Ubuntu获取铁通独立 IP 的脚本</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/179562" style="color:red;">http://oldrev.javaeye.com/blog/179562</a>&nbsp;
          发表时间: 2008年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我的铁通 ADSL 最近几天经常被铁通分配 10.*.*.* 的内网 IP，让我的 MLDonkey 基本上用不了。今天有空顺手写了个脚本自动测试 IP，如果是内网的就断线重拨，直到获得外网 IP 为止 <img src="/images/smiles/icon_biggrin.gif"/><br /><br /><pre name="code" class="ruby">
=begin
    一个 Ubuntu Linux 下自动拨号获取铁通独立 IP 的脚本
    作者：oldrev &lt;oldrev@gmail.com>
    授权: Public Domain
=end

require 'socket'  

# 获取本机 IP 代码来自：
# http://www.javaeye.com/topic/160284

# bits/ioctls.h  
SIOCGIFADDR    = 0x8915          # get PA address            

def get_ip_address(iface)  
    begin  
        sock = UDPSocket.new  
        buf = [iface,""].pack('a16h16')  
        sock.ioctl(SIOCGIFADDR, buf);  
        sock.close  
        buf[20..24] 
    rescue  
        nil  
    end  
end  

def getip
    get_ip_address('ppp0') #通常 ADSL 连接是 ppp0
end

def format_ip ip   
    if ip != nil then ip.unpack("CCCC").join(".") end
end

def recall
    puts "正在断开...."
    system 'poff dsl-provider'
    sleep 1
    puts "正在拨号...."
    system 'pon dsl-provider'
end

def needs_recall(ip)
    ip == nil || ip[0] &lt;= 10 #内网 ip 通常是 10.*.*.*
end

if $0 == __FILE__ then
    ip = getip
    puts "当前 IP 地址是： #{format_ip(ip)}"

    if not needs_recall(ip) then
        puts "不需要重新拨号"
        exit()
    end

    while needs_recall(ip)
        recall
        sleep 4
        ip = getip
        puts "新 IP： #{format_ip(ip)}"
    end

end  

</pre><br /><br />Happy Hacking!
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/179562#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Apr 2008 23:08:01 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/179562</link>
        <guid>http://oldrev.javaeye.com/blog/179562</guid>
      </item>
          <item>
        <title>D新闻组里的天才代码</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/177844" style="color:red;">http://oldrev.javaeye.com/blog/177844</a>&nbsp;
          发表时间: 2008年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          超猛的代码，刚才逛新闻组刚看到的，随便记录一下。<br /><br /><br />出自：<br />http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=68681<br /><br /><br /><pre name="code" class="java">
import std.stdio;
import std.traits;

//检测整数操作溢出，不过对性能的影响比较大，lazy 关键字的标准运用。
Integral checked(Integral)(lazy Integral dg)
{
     static assert(isIntegral!(Integral));

     Integral result = dg(); //这里才对委托 dg 里的表达式求值
     asm {
         jo overflow;
     }
     return result;

     overflow:
     throw new Exception("Integer overflow occured");
}

int main()
{
     int t = int.max;
     try
     {
         int s = checked(t + 1);
         writefln("Result is %d", s);
     }
     catch(Exception e)
     {
         writefln("Whoops! %s", e.toString());
     }
     return 0;
}</pre><br /><br />连 WB 都服了。
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/177844#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 30 Mar 2008 21:26:41 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/177844</link>
        <guid>http://oldrev.javaeye.com/blog/177844</guid>
      </item>
          <item>
        <title>Ubuntu &amp; D</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/175045" style="color:red;">http://oldrev.javaeye.com/blog/175045</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天 Ubuntu Linux 8.04 (Hardy) 刚放出了 Beta1，昨天没事就下载了下来尝尝鲜。<br />习惯性的输入 sudo apt-get install gdc，居然给我装上了 GDC 0.25，这个还没发布的版本。
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/175045#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Mar 2008 12:33:18 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/175045</link>
        <guid>http://oldrev.javaeye.com/blog/175045</guid>
      </item>
          <item>
        <title>NHibernate+PostgreSQL 的中文支持</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/173187" style="color:red;">http://oldrev.javaeye.com/blog/173187</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这几天一直在用 Castle+MonoRail+NHibernate，乘着 PostgreSQL 8.3 发布的春风，顺势把开发数据库从 SQL Server 2005 Express 迁移到了 PostgreSQL 8.3。结果没想到，照抄 NHibernate 官网 http://www.hibernate.org/361.html 上的 PostgreSQL 配置却死活不能插入包含中文的记录，折腾了若干天，后来才在一个日文网站上找到了原因，在连接字符串里要加上 Encoding=UNICODE 参数......<br /><br />下面是某的 NHB 连接 PostgreSQL 数据库标准配置：<br /><br /><pre name="code" class="xml">    
&lt;item key="hibernate.connection.provider">NHibernate.Connection.DriverConnectionProvider&lt;/item>
          &lt;item key="hibernate.connection.driver_class">NHibernate.Driver.NpgsqlDriver&lt;/item>
          &lt;item key="hibernate.connection.connection_string">
            Server=localhost;Database=nebula-dev;Encoding=UNICODE;User ID=YOUR_NAME_HERE;Password=YOUR_PASSWORD_HERE;
          &lt;/item>
          &lt;item key="hibernate.dialect">NHibernate.Dialect.PostgreSQLDialect&lt;/item>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/173187#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Mar 2008 22:05:25 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/173187</link>
        <guid>http://oldrev.javaeye.com/blog/173187</guid>
      </item>
          <item>
        <title>用 VS Express 版本开发 Castle/MonoRail Web 应用</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/166643" style="color:red;">http://oldrev.javaeye.com/blog/166643</a>&nbsp;
          发表时间: 2008年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Visual C#/Basic/C++ 2008 Express 是微软最新推出的免费开发工具，既然是免费，功能上就有不少的限制，最大的麻烦就是不支持直接创建 ASP.Net应用程序，要写 ASP.Net 应用还要使用专门的 Visual WebDeveloper Express 2008，顺带还限制了不能编译代码文件为DLL......<br /><br />不过现在有了 Castle 项目，一切情况都好起来了，Castle.MonoRail 提供了 MVC 的 Web 架构，而且不需要 ASP.Net 的支持，加上超强的 Brail 视图引擎，开发起来比 ASP.Net 还要简洁直观。<br /><br />其中的秘诀就在于，把 MonoRail 应用创建为 VS Express 直接支持的类库项目（Class Library Project），这样不仅能够使用 MonoRail，还能把代码直接编译为 Dll，大大提高性能。<br /><br />关于开发服务器的问题，我们可以选择 Castle 自带的 Cassini Web 服务器，把它放到项目的 /project/bin 目录中即可，运行效果与 VS 标准版所带的开发服务器相同。<br /><br />当然了，其实如果决定采用 MonoRail 而不是可视化的 VS+ASP.Net，那么 NAnt+NUnit+Editor 是另外一个可以考虑的替代选择，不仅仅是整套的免费开源开发环境，还能在 Mono 的支持下在非 Windows 平台下开发运行，体现 Mono 跨平台的优势。
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/166643#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 02 Mar 2008 14:52:46 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/166643</link>
        <guid>http://oldrev.javaeye.com/blog/166643</guid>
      </item>
          <item>
        <title>一对活宝—— MySQL &amp; PostgreSQL</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/155171" style="color:red;">http://oldrev.javaeye.com/blog/155171</a>&nbsp;
          发表时间: 2008年01月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天突然发现一个很幽默的事情：</p><p>&nbsp;</p><p><a href="http://www.mysql.com" target="_blank" title="MySQL">MySQL</a> 首页上的标题是：&ldquo;The world's most popular open source database&rdquo;</p><p><a href="http://www.postgresql.org" target="_blank" title="PostgreSQL">PostgreSQL </a>首页的标题是：&ldquo;The world's most advanced open source database&quot;</p><p>&nbsp;</p>....<br /><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/155171#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jan 2008 21:57:46 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/155171</link>
        <guid>http://oldrev.javaeye.com/blog/155171</guid>
      </item>
          <item>
        <title>Mono 1.2.6 发布</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/148170" style="color:red;">http://oldrev.javaeye.com/blog/148170</a>&nbsp;
          发表时间: 2007年12月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          来自 http://www.mono-project.com/ ，最cool 的特性是支持了 sliverlight，现在我开始期待 WPF 了，呵呵。<br />
这个版本看样子着重加强了对 asp.net 的支持，可能Linq在明年第一季度就可用了。<br />
<br />
We have just released Mono 1.2.6.&nbsp;&nbsp; Some of the highlights<br />
&nbsp;&nbsp;&nbsp; for this release include:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; * Native Windows.Forms driver for MacOS X allows<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Winforms-based applications to run without an X<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; server.（似乎跟大多数人没关系）<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * Support for the ASP.NET AJAX APIs and controls. <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * Support for FastCGI deployments: ASP.NET can now<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; be deployed on a multitude of servers that implement<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; the FastCGI protocol (lighttpd for example) in<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; addition to Apache.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * Windows.Forms now supports the WebControl on<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Windows and Linux using Mozilla.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * Runtime will now consume much less memory for<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2.0-based applications due to various optimizations in<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; generics support as well as including many new<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; performance improvements and an updated verifier and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; an implementation of CoreCLR security.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * C# compiler is quickly approaching full 3.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; support, most of the basics work right now (except<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; support for System.Query.Expression AST generation). <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * Mono 1.2.6 can now be used as an SDK for creating<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Silverlight 1.1 applications on all platforms.&nbsp;&nbsp; This<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; allows developers to create applications that target<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Silverlight without requiring a Windows installation.
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/148170#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 13 Dec 2007 20:36:17 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/148170</link>
        <guid>http://oldrev.javaeye.com/blog/148170</guid>
      </item>
          <item>
        <title>Linux+Mono 下试用 Castle MonoRail</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/147122" style="color:red;">http://oldrev.javaeye.com/blog/147122</a>&nbsp;
          发表时间: 2007年12月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          虽然我最喜欢的OS是Linux，但是一直对 .Net 这个多语言友好的平台很有好感，而且很最近又发现了 Castle 这套好东西，于是很自然地想让 MonoRail 运行在 Mono 上，居然成功了，Mono 果然是个好东西。<br />
我的测试步骤如下：<br />
<ol>
    <li>确保系统安装了 Mono 1.2.4+ 和 MonoDevelop 0.15+，外加 Mono 附带的纯 C# Web 服务器 XSP。这一切都可以用 Ubuntu 的包管理系统安装，如果你用 Ubuntu Gutsy 的话。推荐到 www.getdeb.net 中下载安装最新的 MonoDevelop。<br />
    </li>
    <li>到 <a href="http://www.openbeta.cn/FirstMonoRail.ashx">http://www.openbeta.cn/FirstMonoRail.ashx</a>下载包含了已编译 MonoRail 框架的范例程序 MonoRailSample.zip，解压到一个目录中，这里我们假设为 &quot;MonoRailSample&quot;。</li>
    <li>用 MonoDevelop 打开 MonoRailSample.sln，并编译整个解决方案，如果 MonoDevelop 提示没有找到引用之类的错误信息，请把两个项目现存的引用删掉，再从项目的 bin 目录里添加引用相应的 DLL。</li>
    <li>注意大小写！把 MonoRailSample/MonoRailSample/Web.config 的文件名改为 web.config，&quot;Default.aspx&quot; 改名为&ldquo;default.aspx&quot;，同时强烈推荐把 Views 目录改名为 views，并修改 web.config 中的相应条目。</li>
    <li>在有 default.aspx 的目录中运行 xsp，XSP 会提示服务建立于 http://localhost:8080，用你的 FireFox 打开这个 URL 立刻可以看到 NVelocity 的渲染结果。</li>
</ol>
至此，希望你的 Mono on MonoRail 测试和我一样成功。<br />
<br />
Good luck!
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/147122#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 09 Dec 2007 22:29:06 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/147122</link>
        <guid>http://oldrev.javaeye.com/blog/147122</guid>
      </item>
          <item>
        <title>出色的开源项目管理软件——Redmine</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/141031" style="color:red;">http://oldrev.javaeye.com/blog/141031</a>&nbsp;
          发表时间: 2007年11月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近想在我的机器上配置一个 Trac 来管理我自己的小项目，尝试结果却令人失望，Trac 本身依赖无数的 Python 库不说，还非得要过时的 Python 2.4，而我的 Ubuntu Gutsy 默认安装的是 Python2.5，装两个 python 实在是让人不舒服。<br />
幸运的是，在找 Trac 依赖库的过程中，我发现了 Redmine，一个基于 Ruby On Rails 开发的开源项目管理软件，不仅没有名目繁多的依赖，而且界面清爽，功能齐全，重要的是解压后简单配置一下数据库就能使用，实在是 Ruby/Rails 爱好者的最佳选择。<br />
<br />
下面是安装 Redmine 的简介，由于 Redmine 基于 Rails 框架，因此详细的配置可以参考丰富的 Rails 书籍和文档。<br />
<h3>1. 配置运行环境</h3>
从 Redmine 的老巢 <a href="http://www.redmine.org">www.redmine.org</a> 下载 Remine 源码包并解压到一个目录中，这里假定是 &quot;redmine&quot;。<br />
请确保机器上已经安装了 Ruby 解释器，Ubuntu/Debian Linux 用户可以用 sudo apt-get install ruby rubygems 来安装。Redmine 本身自带了 MySQL 驱动，如果需要使用其他数据库可以通过 gem 或者 apt-get 来手动安装，这里我个人强烈推荐使用 Gem 而不是 Linux 系统自带的包管理系统来安装 Ruby 相关的软件包。比如我使用 SQLite3，那么就使用 apt-get install sqlite3 libsqlite3-ruby 命令安装。<br />
<h3>2. 配置数据库</h3>
用文本编辑器打开 redmine/db/database.yml.example 文件，把 production 节下的配置按你实际情况修改。举个例子，为了使用 SQLite3 作为数据库后端，我们把它修改成如下形式：<br />
<br />
production<br />
&nbsp; adapter: sqlite3<br />
&nbsp; database: db/redmine.sqlite3 #数据库为 /redmine/db/redmine.sqlite3 文件<br />
&nbsp; host: localhost<br />
&nbsp; username:<br />
&nbsp; password:<br />
<br />
修改完成后把 database.yml.example 文件更名为 database.yml，更改当前目录为 redmine，执行命令：<br />
&nbsp; rake db:migrate RAILS_ENV=&quot;production&quot;<br />
&nbsp; rake redmine:load_default_data RAILS_ENV=&quot;production&quot;<br />
这将自动创建数据库和相关的表，并将 Redmine 设置为默认状态。至此，我们的 Redmine 已经准备好运行了。<br />
<h3>3. 运行</h3>
作为简单的本机项目管理程序，这里我采用 Ruby 自带的 WEBRick HTTP 服务器，需要使用 Apache 等生产级服务器的用户可以参考 Rails 相关文档进行配置。<br />
确保当前目录为 redmine，简单地执行命令 ruby script/server -e production 启动 Redmine。<br />
现在用你的浏览器打开 http://localhost:3000，马上可以看到 Redmine 的首页，还犹豫什么，赶快用用户名 admin，密码 admin 登录吧！
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/141031#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Nov 2007 23:43:44 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/141031</link>
        <guid>http://oldrev.javaeye.com/blog/141031</guid>
      </item>
          <item>
        <title>mixin 模拟多继承</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/139668" style="color:red;">http://oldrev.javaeye.com/blog/139668</a>&nbsp;
          发表时间: 2007年11月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">D1.0 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-cpp" start="1">
    <li class="alt"><span><span class="comment">/** TupleMixin 演示程序, DMD2.007/GDC0.24 测试通过</span> </span></li>
    <li class=""><span><span class="comment">  Written in the D programming language 1.0</span> </span></li>
    <li class="alt"><span><span class="comment">作者： oldrev </span> </span></li>
    <li class=""><span><span class="comment">Copyrights:</span> <strong>BSD</strong></span></li>
    <li class="alt"><span><span class="comment">*/</span><span>  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>import std.stdio;  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="comment">//PredT 参数的作用是让你能够在每个模板混入之前对它进行处理,</span><span>  </span></span></li>
    <li class=""><span><span class="comment">//比如可以在混入前用 static assert 检查是否有特定的成员</span><span>  </span></span></li>
    <li class="alt"><span><span class="comment">//总而言之，PredT 给你机会控制混入时的细节。</span><span>  </span></span></li>
    <li class=""><span><span class="keyword">template</span><span> MixinTuple(alias PredT, L...)  </span></span></li>
    <li class="alt"><span>{  </span></li>
    <li class=""><span>    mixin PredT!(L[0]);  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">static</span><span> </span><span class="keyword">if</span><span>(L.length &gt; 1)  </span></span></li>
    <li class="alt"><span>        mixin MixinTuple!(PredT, L[1..$]);  </span></li>
    <li class=""><span>}  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="comment">// P 是所有准备当做超类的模板</span><span>  </span></span></li>
    <li class="alt"><span><span class="keyword">class</span><span> Mixinable(SuperClass, P...) : SuperClass  </span></span></li>
    <li class=""><span>{  </span></li>
    <li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="keyword">const</span><span> string InitCode = </span><span class="string">&quot;private void initAllMixins() {&quot;</span><span>;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="comment">//PredT 的一个例子，混入且产生与模板同名的 alias</span><span>  </span></span></li>
    <li class=""><span>    <span class="keyword">template</span><span> MixinWithAliasPred(alias X) {  </span></span></li>
    <li class="alt"><span>        mixin(<span class="string">&quot;mixin X!() &quot;</span><span> ~ (X.stringof)[0..$-2] ~ </span><span class="string">&quot;;&quot;</span><span>); </span><span class="comment">//去掉模板名称后的 '()'</span><span>  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    mixin MixinTuple!(MixinWithAliasPred, P);  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">private</span><span> </span><span class="keyword">template</span><span> MakeInitCode(TL...)    </span></span></li>
    <li class="alt"><span>    {   </span></li>
    <li class=""><span>        <span class="keyword">static</span><span> </span><span class="keyword">if</span><span>(TL.length == 0)  </span></span></li>
    <li class="alt"><span>            <span class="keyword">const</span><span> string MakeInitCode = </span><span class="string">&quot;&quot;</span><span>;  </span></span></li>
    <li class=""><span>        <span class="keyword">else</span><span>   </span></span></li>
    <li class="alt"><span>        {   <span class="comment">//&quot;HasMember&quot; 惯用法</span><span>  </span></span></li>
    <li class=""><span>            <span class="keyword">static</span><span> </span><span class="keyword">if</span><span>(is(typeof(mixin(TL[0].stringof[0..$-2] ~ </span><span class="string">&quot;._ctor&quot;</span><span>))))   </span></span></li>
    <li class="alt"><span>            {   <span class="comment">//如果TL[0] 有 _ctor 成员函数（也就是 this()），我们就产生调用 _ctor 的代码。</span><span>  </span></span></li>
    <li class=""><span>                <span class="keyword">const</span><span> string MakeInitCode = TL[0].stringof[0..$-2] ~ </span><span class="string">&quot;._ctor();\n&quot;</span><span> ~   </span></span></li>
    <li class="alt"><span>                    MakeInitCode!(TL[1..$]);  </span></li>
    <li class=""><span>            }  </span></li>
    <li class="alt"><span>            <span class="keyword">else</span><span> </span><span class="comment">//没有 _ctor，继续递归</span><span>  </span></span></li>
    <li class=""><span>                <span class="keyword">const</span><span> string MakeInitCode = MakeInitCode!(TL[1..$]);  </span></span></li>
    <li class="alt"><span>        }  </span></li>
    <li class=""><span>    }    </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">this</span><span>()  </span></span></li>
    <li class="alt"><span>    {  </span></li>
    <li class=""><span>        mixin(MakeInitCode!(P)); <span class="comment">//产生并执行代码调用所有模板的 this()</span><span>  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>}  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="comment">/////////////////////////////////////////////////////</span><span>  </span></span></li>
    <li class="alt"><span><span class="comment">//开始演示:</span><span>  </span></span></li>
    <li class=""><span><span class="comment">/////////////////////////////////////////////////////</span><span>  </span></span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="keyword">template</span><span> Policy()  </span></span></li>
    <li class="alt"><span>{  </span></li>
    <li class=""><span>    <span class="keyword">this</span><span>() {  </span></span></li>
    <li class="alt"><span>        writefln(<span class="string">&quot;Policy.this()&quot;</span><span>);  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    ~<span class="keyword">this</span><span>() {  </span></span></li>
    <li class="alt"><span>        writefln(<span class="string">&quot;Policy.~this()&quot;</span><span>);  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">void</span><span> bar(T)(T x) {  </span></span></li>
    <li class="alt"><span>        writefln(<span class="string">&quot;bar()&quot;</span><span>);  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>}  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">template</span><span> Policy2()  </span></span></li>
    <li class=""><span>{  </span></li>
    <li class="alt"><span>    <span class="keyword">this</span><span>() {  </span></span></li>
    <li class=""><span>        writefln(<span class="string">&quot;Policy2.this()&quot;</span><span>);  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    ~<span class="keyword">this</span><span>() {  </span></span></li>
    <li class=""><span>        writefln(<span class="string">&quot;Policy2.~this()&quot;</span><span>);  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">void</span><span> foo() { writefln(</span><span class="string">&quot;Policy2.foo&quot;</span><span>); }  </span></span></li>
    <li class=""><span>}  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="keyword">class</span><span> SuperBar </span><span class="comment">//超类，或者叫基类</span><span>  </span></span></li>
    <li class="alt"><span>{  </span></li>
    <li class=""><span>    <span class="keyword">this</span><span>() {  </span></span></li>
    <li class="alt"><span>        writefln(<span class="string">&quot;SuperBar.this()&quot;</span><span>);  </span></span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>}  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="comment">// Mixinable 用法演示&mdash;&mdash;模拟多继承</span><span>  </span></span></li>
    <li class=""><span><span class="comment">// Foo 类是组合 Policy, Policy2 和 基类 SuperBar 的结果</span><span>  </span></span></li>
    <li class="alt"><span><span class="keyword">class</span><span> Foo : Mixinable!(SuperBar, Policy, Policy2)  </span></span></li>
    <li class=""><span>{  </span></li>
    <li class="alt"><span>    <span class="keyword">this</span><span>() {  </span></span></li>
    <li class=""><span>        writefln(<span class="string">&quot;Foo.this()&quot;</span><span>);  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">void</span><span> foo() { writefln(</span><span class="string">&quot;Foo.foo&quot;</span><span>); }  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    ~<span class="keyword">this</span><span>() {  </span></span></li>
    <li class=""><span>        writefln(<span class="string">&quot;Foo.~this()&quot;</span><span>);  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>}  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="keyword">void</span><span> main()  </span></span></li>
    <li class="alt"><span>{  </span></li>
    <li class=""><span>    Foo f = <span class="keyword">new</span><span> Foo;  </span></span></li>
    <li class="alt"><span>    f.foo;  </span></li>
    <li class=""><span>    f.bar(3);  </span></li>
    <li class="alt"><span>}  </span></li>
</ol>
</div>
<br />
输出：
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>SuperBar.this()  </span></span></li>
    <li class=""><span>SuperBar.this()  </span></li>
    <li class="alt"><span>Policy.this()  </span></li>
    <li class=""><span>SuperBar.this()  </span></li>
    <li class="alt"><span>Policy2.this()  </span></li>
    <li class=""><span>Foo.this()  </span></li>
    <li class="alt"><span>Foo.foo  </span></li>
    <li class=""><span>bar()  </span></li>
    <li class="alt"><span>Foo.~this()  </span></li>
    <li class=""><span>Policy2.~this()  </span></li>
    <li class="alt"><span>Policy.~this()  </span></li>
</ol>
</div>
<br />
<br />
Have fun!
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/139668#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Nov 2007 17:40:48 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/139668</link>
        <guid>http://oldrev.javaeye.com/blog/139668</guid>
      </item>
          <item>
        <title>简单的 C to D 转换 Ruby 脚本</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/135286" style="color:red;">http://oldrev.javaeye.com/blog/135286</a>&nbsp;
          发表时间: 2007年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天晚上费了点脑筋写了一个简单的 C2D 转换脚本，大致实现了函数申明、全局变量、typedef、enum、struct 和数组的转换，但是还不支持预处理、union、调用约定等。<br />
<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-rb">
    <li class="alt"><span><span class="comment">#!/bin/ruby</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>require&nbsp;'rexml/document'&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">#TODO:</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">#&nbsp;*&nbsp;调用约定</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">#&nbsp;*&nbsp;union</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">#&nbsp;#&nbsp;冲突关键字检查</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>puts&nbsp;<span class="string">&quot;c2d.rb&nbsp;0.002&nbsp;-&nbsp;A&nbsp;C&nbsp;to&nbsp;D&nbsp;Converter&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>puts&nbsp;<span class="string">&quot;Written&nbsp;by&nbsp;Wei&nbsp;Li&nbsp;&lt;oldrev&lt;at&gt;gmail.com&gt;&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>puts&nbsp;<span class="string">&quot;License:&nbsp;GPL&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>CFile&nbsp;=&nbsp;<span class="string">&quot;hdr.c&quot;</span><span>&nbsp;</span><span class="comment">#需要转换的&nbsp;.h&nbsp;或&nbsp;.c&nbsp;文件</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>XmlFile&nbsp;=&nbsp;(CFile.map&nbsp;{&nbsp;<span class="variable">|fn</span><span>|&nbsp;fn&nbsp;+=&nbsp;</span><span class="string">&quot;.xml&quot;</span><span>&nbsp;}).to_s&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>DVersion2&nbsp;=&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Cmd=&nbsp;<span class="string">&quot;gccxml&nbsp;--gccxml-compiler&nbsp;\&quot;gcc\&quot;&nbsp;--gccxml-cxxflags&nbsp;\&quot;-x&nbsp;c\&quot;&nbsp;#{CFile}&nbsp;-fxml=#{XmlFile}&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>puts&nbsp;Cmd&nbsp;&nbsp;</span></li>
    <li class="alt"><span>system&nbsp;Cmd&nbsp;&nbsp;</span></li>
    <li class=""><span>puts&nbsp;<span class="string">&quot;GCCXML&nbsp;转换完成&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;Generator&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;initialize(xml_file,&nbsp;writer)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@writer</span><span>&nbsp;=&nbsp;writer&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;<span class="string">&quot;正在加载&nbsp;XML&nbsp;文档&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@xmlroot</span><span>&nbsp;=&nbsp;REXML::Document.</span><span class="keyword">new</span><span>(</span><span class="builtin">File</span><span>.open(xml_file)).elements[</span><span class="string">&quot;GCC_XML&quot;</span><span>].elements&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builitin_ele&nbsp;=&nbsp;<span class="variable">@xmlroot</span><span>[</span><span class="string">&quot;File[contains(@name,&nbsp;'gccxml_builtins.h')]&quot;</span><span>].attributes[</span><span class="string">&quot;id&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#去掉&nbsp;GCCXML&nbsp;内置的东西</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@xmlroot</span><span>.delete_all&nbsp;</span><span class="string">&quot;*[@file='#{builitin_ele}']&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;<span class="string">&quot;完成&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_linkage&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;extern(C)&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_fundamental_type(type_ele)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;type_ele.attributes[</span><span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;short&nbsp;int&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;short&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;short&nbsp;unsigned&nbsp;int&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;ushort&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;int&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;int&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;long&nbsp;int&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;int&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;unsigned&nbsp;int&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;uint&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;long&nbsp;unsigned&nbsp;int&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;int&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;long&nbsp;long&nbsp;int&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;long&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;long&nbsp;long&nbsp;unsigned&nbsp;int&quot;</span><span>&nbsp;:&nbsp;</span><span class="string">&quot;ulong&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;float&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;float&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;double&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;double&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;char&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;char&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;unsigned&nbsp;char&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;ubyte&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;signed&nbsp;char&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;byte&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;void&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;void&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;wchar_t&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;type_ele.attributes[</span><span class="string">&quot;size&quot;</span><span>]&nbsp;==&nbsp;</span><span class="string">&quot;32&quot;</span><span>&nbsp;</span><span class="keyword">then</span><span>&nbsp;</span><span class="string">&quot;dchar&quot;</span><span>&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="string">&quot;wchar&quot;</span><span>&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;signed&nbsp;wchar_t&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;type_ele.attributes[</span><span class="string">&quot;size&quot;</span><span>]&nbsp;==&nbsp;</span><span class="string">&quot;32&quot;</span><span>&nbsp;</span><span class="keyword">then</span><span>&nbsp;</span><span class="string">&quot;int&quot;</span><span>&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="string">&quot;short&quot;</span><span>&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;unsigned&nbsp;wchar_t&quot;</span><span>&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;type_ele.attributes[</span><span class="string">&quot;size&quot;</span><span>]&nbsp;==&nbsp;</span><span class="string">&quot;32&quot;</span><span>&nbsp;</span><span class="keyword">then</span><span>&nbsp;</span><span class="string">&quot;uint&quot;</span><span>&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="string">&quot;ushort&quot;</span><span>&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_type(type_id)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ele&nbsp;=&nbsp;<span class="variable">@xmlroot</span><span>[</span><span class="string">&quot;*[@id='#{type_id}']&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;ele.name&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;FundamentalType&quot;</span><span>&nbsp;:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generate_fundamental_type&nbsp;ele&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;Struct&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@xmlroot</span><span>[</span><span class="string">&quot;*[@id='#{type_id}']&quot;</span><span>].attributes[</span><span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;Typedef&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@xmlroot</span><span>[</span><span class="string">&quot;*[@id='#{type_id}']&quot;</span><span>].attributes[</span><span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;FunctionType&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generate_function_type(ele)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#下面都是间接类型</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;ArrayType&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;ele.attributes[<span class="string">&quot;max&quot;</span><span>].to_i&nbsp;-&nbsp;ele.attributes[</span><span class="string">&quot;min&quot;</span><span>].to_i&nbsp;+&nbsp;1&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indirect_type&nbsp;=&nbsp;ele.attributes[<span class="string">&quot;type&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generate_type(indirect_type)&nbsp;+&nbsp;<span class="string">&quot;[#{size}]&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;PointerType&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indirect_type&nbsp;=&nbsp;ele.attributes[<span class="string">&quot;type&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#函数指针需要特殊处理</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;</span><span class="variable">@xmlroot</span><span>[</span><span class="string">&quot;*[@id='#{indirect_type}']&quot;</span><span>].name&nbsp;==&nbsp;</span><span class="string">&quot;FunctionType&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generate_type(indirect_type)&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;generate_type(indirect_type)&nbsp;+&nbsp;</span><span class="string">&quot;*&quot;</span><span>&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;CvQualifiedType&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indirect_type&nbsp;=&nbsp;ele.attributes[<span class="string">&quot;type&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;</span><span class="variable">@xmlroot</span><span>[</span><span class="string">&quot;*[@id='#{indirect_type}']&quot;</span><span>].name&nbsp;==&nbsp;</span><span class="string">&quot;FundamentalType&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;const&nbsp;&quot;</span><span>&nbsp;+&nbsp;generate_type(indirect_type)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;DVersion2&nbsp;:&nbsp;</span><span class="string">&quot;const(&quot;</span><span>&nbsp;+&nbsp;generate_type(indirect_type)&nbsp;+&nbsp;</span><span class="string">&quot;)&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;generate_type(indirect_type)&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_parameters(funcEle)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;=&nbsp;[]&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcEle.elements.<span class="keyword">each</span><span>(</span><span class="string">&quot;Argument&quot;</span><span>)&nbsp;{&nbsp;</span><span class="variable">|arg</span><span>|&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type_id&nbsp;=&nbsp;arg.attributes[<span class="string">&quot;type&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;=&nbsp;generate_type(type_id)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;arg.attributes[<span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;&lt;&lt;&nbsp;<span class="keyword">if</span><span>&nbsp;name&nbsp;:&nbsp;</span><span class="string">&quot;#{type}&nbsp;#{name}&quot;</span><span>&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="string">&quot;#{type}&quot;</span><span>&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;params.length&nbsp;==&nbsp;1&nbsp;</span><span class="keyword">then</span><span>&nbsp;</span><span class="keyword">return</span><span>&nbsp;params[0]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;params.join(</span><span class="string">&quot;,&nbsp;&quot;</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_function_decl(e)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return_type&nbsp;=&nbsp;generate_type(e.attributes[<span class="string">&quot;returns&quot;</span><span>])&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_name&nbsp;=&nbsp;e.attributes[<span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameters&nbsp;=&nbsp;generate_parameters(e)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;#{return_type}&nbsp;#{function_name}(#{parameters});\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_function_type(e)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return_type&nbsp;=&nbsp;generate_type(e.attributes[<span class="string">&quot;returns&quot;</span><span>])&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameters&nbsp;=&nbsp;generate_parameters(e)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;#{return_type}&nbsp;function(#{parameters})&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_fields(members)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;=&nbsp;<span class="string">&quot;&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field_ids&nbsp;=&nbsp;[]&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@xmlroot</span><span>.</span><span class="keyword">each</span><span>(</span><span class="string">&quot;Field&quot;</span><span>)&nbsp;{&nbsp;</span><span class="variable">|f</span><span>|&nbsp;field_ids&nbsp;&lt;&lt;&nbsp;f.attributes[</span><span class="string">&quot;id&quot;</span><span>]&nbsp;}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;members.<span class="keyword">each</span><span>&nbsp;{&nbsp;</span><span class="variable">|mid</span><span>|&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;field_ids.include?&nbsp;mid&nbsp;</span><span class="keyword">then</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fe&nbsp;=&nbsp;<span class="variable">@xmlroot</span><span>[</span><span class="string">&quot;*[@id='#{mid}']&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;=&nbsp;generate_type(fe.attributes[<span class="string">&quot;type&quot;</span><span>])&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;fe.attributes[<span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;<span class="string">&quot;\t#{type}&nbsp;#{name};\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;dcode&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_struct(struct_ele)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct_name&nbsp;=&nbsp;struct_ele.attributes[<span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;=&nbsp;<span class="string">&quot;\nstruct&nbsp;#{struct_name}\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;<span class="string">&quot;{\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;generate_fields(struct_ele.attributes[<span class="string">&quot;members&quot;</span><span>].split(</span><span class="string">&quot;&nbsp;&quot;</span><span>)&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;<span class="string">&quot;};\n\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;dcode&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_typedef_decl(typedef_ele)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef_name&nbsp;=&nbsp;typedef_ele.attributes[<span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;=&nbsp;generate_type(typedef_ele.attributes[<span class="string">&quot;type&quot;</span><span>])&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;=&nbsp;<span class="string">&quot;alias&nbsp;#{type}&nbsp;#{typedef_name};\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;dcode&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_variable(var_ele)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var_name&nbsp;=&nbsp;var_ele.attributes[<span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;=&nbsp;generate_type(var_ele.attributes[<span class="string">&quot;type&quot;</span><span>])&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init&nbsp;=&nbsp;var_ele.attributes[<span class="string">&quot;init&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;=&nbsp;<span class="string">&quot;#{type}&nbsp;#{var_name}&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;var_ele.attributes[</span><span class="string">&quot;extern&quot;</span><span>]&nbsp;</span><span class="keyword">then</span><span>&nbsp;dcode&nbsp;=&nbsp;</span><span class="string">&quot;extern&nbsp;#{dcode}&quot;</span><span>&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;init&nbsp;</span><span class="keyword">then</span><span>&nbsp;dcode&nbsp;=&nbsp;</span><span class="string">&quot;#{dcode}&nbsp;=&nbsp;#{init}&quot;</span><span>&nbsp;</span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;=&nbsp;<span class="string">&quot;#{dcode};\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;generate_enum(enum_ele)&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;=&nbsp;<span class="string">&quot;enum&nbsp;&quot;</span><span>&nbsp;&lt;&lt;&nbsp;enum_ele.attributes[</span><span class="string">&quot;name&quot;</span><span>]&nbsp;&lt;&lt;&nbsp;</span><span class="string">&quot;&nbsp;:&nbsp;int&nbsp;\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;<span class="string">&quot;{\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;members&nbsp;=&nbsp;[]&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enum_ele.elements.<span class="keyword">each</span><span>(</span><span class="string">&quot;EnumValue&quot;</span><span>)&nbsp;{&nbsp;</span><span class="variable">|ev</span><span>|&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evname&nbsp;=&nbsp;ev.attributes[<span class="string">&quot;name&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init&nbsp;=&nbsp;ev.attributes[<span class="string">&quot;init&quot;</span><span>]&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;members&nbsp;&lt;&lt;&nbsp;<span class="string">&quot;\t#{evname}&nbsp;=&nbsp;#{init}&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;members.length&nbsp;&lt;=&nbsp;1&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;members[0]&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;members.join(<span class="string">&quot;,\n&quot;</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcode&nbsp;&lt;&lt;&nbsp;<span class="string">&quot;\n}\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;parse_node(node)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@writer</span><span>&nbsp;&lt;&lt;&nbsp;</span><span class="keyword">case</span><span>&nbsp;node.name&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;Enumeration&quot;</span><span>&nbsp;:&nbsp;generate_enum&nbsp;node&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;Function&quot;</span><span>&nbsp;:&nbsp;generate_function_decl&nbsp;node&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;Struct&quot;</span><span>&nbsp;:&nbsp;generate_struct&nbsp;node&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;Typedef&quot;</span><span>&nbsp;:&nbsp;generate_typedef_decl&nbsp;node&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">when</span><span>&nbsp;</span><span class="string">&quot;Variable&quot;</span><span>&nbsp;:&nbsp;generate_variable&nbsp;node&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="string">&quot;&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;parse_all_nodes&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@xmlroot</span><span>.</span><span class="keyword">each</span><span>&nbsp;{&nbsp;</span><span class="variable">|node</span><span>|&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parse_node&nbsp;node&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;</span><span class="comment">#end&nbsp;of&nbsp;class&nbsp;Generator</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>dcode&nbsp;=&nbsp;<span class="string">&quot;&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>gen&nbsp;=&nbsp;Generator.<span class="keyword">new</span><span>(&nbsp;XmlFile,&nbsp;dcode)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>gen.parse_all_nodes&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>puts&nbsp;dcode&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
我测试用的C语言头文件 hdr.c:<br />
<div class="code_title">C代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol start="1" class="dp-cpp">
    <li class="alt"><span><span class="preprocessor">#define DEFINE_CONST 123</span><span>  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">void</span><span> foobar(</span><span class="datatypes">double</span><span>* x);  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="datatypes">double</span><span> varD;  </span></span></li>
    <li class=""><span>unsigned <span class="datatypes">long</span><span>   varL;  </span></span></li>
    <li class="alt"><span><span class="datatypes">wchar_t</span><span> wc;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">struct</span><span> Foo  </span></span></li>
    <li class=""><span>{  </span></li>
    <li class="alt"><span>    <span class="datatypes">int</span><span> x;  </span></span></li>
    <li class=""><span>    <span class="datatypes">double</span><span> y;  </span></span></li>
    <li class="alt"><span>    <span class="datatypes">long</span><span> </span><span class="datatypes">long</span><span> z;  </span></span></li>
    <li class=""><span>};  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="keyword">typedef</span><span> Foo* FooPtr;  </span></span></li>
    <li class="alt"><span><span class="keyword">typedef</span><span> </span><span class="keyword">const</span><span> Foo* ConstFooPtr;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>FooPtr myptr;  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>Foo print(<span class="datatypes">int</span><span> x);  </span></span></li>
    <li class=""><span>Foo* print2(unsigned x, <span class="datatypes">wchar_t</span><span> y, </span><span class="datatypes">long</span><span> </span><span class="datatypes">long</span><span> z);  </span></span></li>
    <li class="alt"><span>Foo* print3(<span class="datatypes">short</span><span> x);  </span></span></li>
    <li class=""><span>Foo* print4(unsigned <span class="datatypes">char</span><span> x);  </span></span></li>
    <li class="alt"><span><span class="keyword">void</span><span> print5(unsigned x[]);  </span></span></li>
    <li class=""><span><span class="keyword">void</span><span> print6(FooPtr fp);  </span></span></li>
    <li class="alt"><span><span class="keyword">void</span><span> print7(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span>* text);  </span></span></li>
    <li class=""><span><span class="keyword">void</span><span> print8(</span><span class="datatypes">char</span><span>** ppText);  </span></span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="keyword">extern</span><span> Foo g_foo;  </span></span></li>
    <li class="alt"><span><span class="keyword">extern</span><span> Foo g_foo10[10];  </span></span></li>
    <li class=""><span><span class="keyword">extern</span><span> </span><span class="datatypes">int</span><span>* g_pint20[20];  </span></span></li>
    <li class="alt"><span><span class="keyword">static</span><span> Foo s_foo;  </span></span></li>
    <li class=""><span><span class="keyword">extern</span><span> </span><span class="keyword">const</span><span> </span><span class="datatypes">double</span><span> PI = 3.1415926;  </span></span></li>
    <li class="alt"><span><span class="keyword">extern</span><span> </span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span>* TestString = </span><span class="string">&quot;Hello&quot;</span><span>;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">typedef</span><span> </span><span class="keyword">void</span><span>(*MyFuncPtr)(</span><span class="datatypes">int</span><span> x, </span><span class="datatypes">long</span><span> y, </span><span class="datatypes">double</span><span> z);  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">enum</span><span> MyEnum  </span></span></li>
    <li class=""><span>{  </span></li>
    <li class="alt"><span>    Enum1 = 1,  </span></li>
    <li class=""><span>    Enum2 = 2  </span></li>
    <li class="alt"><span>};  </span></li>
</ol>
</div>
<br />
输出：
<div class="dp-highlighter">
<div class="bar"> </div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>c2d.rb 0.002 - A C to D Converter  </span></span></li>
    <li class=""><span>Written by Wei Li <span class="tag">&lt;</span><span class="tag-name">oldrev</span><span class="tag">&lt;</span><span class="tag-name">at</span><span class="tag">&gt;</span><span>gmail.com</span><span class="tag">&gt;</span><span>  </span></span></li>
    <li class="alt"><span>License: GPL  </span></li>
    <li class=""><span>gccxml --gccxml-compiler &quot;gcc&quot; --gccxml-cxxflags &quot;-x c&quot; hdr.c <span class="attribute">-fxml</span><span>=</span><span class="attribute-value">hdr</span><span>.c.xml  </span></span></li>
    <li class="alt"><span>GCCXML 转换完成  </span></li>
    <li class=""><span>正在加载 XML 文档  </span></li>
    <li class="alt"><span>完成  </span></li>
    <li class=""><span>enum MyEnum : int   </span></li>
    <li class="alt"><span>{  </span></li>
    <li class=""><span>        <span class="attribute">Enum1</span><span> = 1,  </span></span></li>
    <li class="alt"><span>        <span class="attribute">Enum2</span><span> = 2  </span></span></li>
    <li class=""><span>}  </span></li>
    <li class="alt"><span>alias void function(int, int, double) MyFuncPtr;  </span></li>
    <li class=""><span>const char* <span class="attribute">TestString</span><span> = </span><span class="attribute-value">&quot;Hello&quot;</span><span>;  </span></span></li>
    <li class="alt"><span>const double <span class="attribute">PI</span><span> = </span><span class="attribute-value">3</span><span>.14159260000000006840537025709636509418487548828e+0;  </span></span></li>
    <li class=""><span>Foo s_foo;  </span></li>
    <li class="alt"><span>extern int*[20] g_pint20;  </span></li>
    <li class=""><span>extern Foo[10] g_foo10;  </span></li>
    <li class="alt"><span>extern Foo g_foo;  </span></li>
    <li class=""><span>void print8(char** ppText);  </span></li>
    <li class="alt"><span>void print7(const char* text);  </span></li>
    <li class=""><span>void print6(FooPtr fp);  </span></li>
    <li class="alt"><span>void print5(uint* x);  </span></li>
    <li class=""><span>Foo* print4(ubyte x);  </span></li>
    <li class="alt"><span>Foo* print3(short x);  </span></li>
    <li class=""><span>Foo* print2(uint x, dchar y, long z);  </span></li>
    <li class="alt"><span>Foo print(int x);  </span></li>
    <li class=""><span>FooPtr myptr;  </span></li>
    <li class="alt"><span>alias Foo* ConstFooPtr;  </span></li>
    <li class=""><span>alias Foo* FooPtr;  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>struct Foo  </span></li>
    <li class="alt"><span>{  </span></li>
    <li class=""><span>        int x;  </span></li>
    <li class="alt"><span>        double y;  </span></li>
    <li class=""><span>        long z;  </span></li>
    <li class="alt"><span>};  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>dchar wc;  </span></li>
    <li class=""><span>int varL;  </span></li>
    <li class="alt"><span>double varD;  </span></li>
    <li class=""><span>void foobar(double* x);  </span></li>
</ol>
</div>
<br />
<h2>Requirements</h2>
<ol>
    <li>Ruby1.8: 废话</li>
    <li>GCCXML: Linux 直接使用包管理系统安装，Windows 可到 www.gccxml.org 下载安装程序</li>
</ol>
<br />
Have fun！
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/135286#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 24 Oct 2007 22:06:31 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/135286</link>
        <guid>http://oldrev.javaeye.com/blog/135286</guid>
      </item>
          <item>
        <title>D1.0代码模拟 __traits(hasMember, ...)</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/129917" style="color:red;">http://oldrev.javaeye.com/blog/129917</a>&nbsp;
          发表时间: 2007年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          通过1.0的代码完全模拟了 D 2.0 __traits(hasMember...) 和部分 getMember 的功能：<br />
<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>import&nbsp;std.stdio;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>template&nbsp;HasMember(T,&nbsp;<span class="keyword">string</span><span>&nbsp;member)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;HasMember&nbsp;=&nbsp;</span><span class="keyword">is</span><span>(</span><span class="keyword">typeof</span><span>(mixin(</span><span class="string">&quot;T.&quot;</span><span>&nbsp;~&nbsp;member)));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>template&nbsp;HasMember(alias&nbsp;X,&nbsp;<span class="keyword">string</span><span>&nbsp;member)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;HasMember&nbsp;=&nbsp;</span><span class="keyword">is</span><span>(</span><span class="keyword">typeof</span><span>(mixin(</span><span class="string">&quot;X.&quot;</span><span>&nbsp;~&nbsp;member)));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//A&nbsp;very&nbsp;limited&nbsp;implemention</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>template&nbsp;GetMember(alias&nbsp;X,&nbsp;<span class="keyword">string</span><span>&nbsp;member)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//mixin(&quot;alias&nbsp;X.&quot;&nbsp;~&nbsp;member&nbsp;~&nbsp;&quot;GetMember;&quot;);&nbsp;//&nbsp;Compiler's&nbsp;bug?</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mixin(<span class="string">&quot;alias&nbsp;X.&quot;</span><span>&nbsp;~&nbsp;member&nbsp;~&nbsp;</span><span class="string">&quot;&nbsp;DummyAlias;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;DummyAlias&nbsp;GetMember;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>template&nbsp;BarT()&nbsp;&nbsp;</span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;PI&nbsp;=&nbsp;3.14;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">void</span><span>&nbsp;main()&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class</span><span>&nbsp;Foo&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;n&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;m;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">void</span><span>&nbsp;bar()&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(<span class="string">&quot;Foo.bar()&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;add(</span><span class="keyword">int</span><span>&nbsp;x,&nbsp;</span><span class="keyword">int</span><span>&nbsp;y)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(<span class="string">&quot;Foo.add():&nbsp;&quot;</span><span>,&nbsp;x&nbsp;+&nbsp;y);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(Foo,&nbsp;<span class="string">&quot;bar&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(Foo,&nbsp;<span class="string">&quot;m&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(Foo,&nbsp;<span class="string">&quot;sizeof&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(Foo,&nbsp;<span class="string">&quot;foo&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(Foo,&nbsp;<span class="string">&quot;y&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(<span class="keyword">int</span><span>,&nbsp;</span><span class="string">&quot;sizeof&quot;</span><span>));&nbsp;</span><span class="comment">//内置属性也支持</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(std.stdio,&nbsp;<span class="string">&quot;writefln&quot;</span><span>));&nbsp;</span><span class="comment">//&nbsp;支持检测模块中的成员</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(HasMember!(BarT!(),&nbsp;<span class="string">&quot;PI&quot;</span><span>));&nbsp;</span><span class="comment">//&nbsp;支持模板成员</span><span>&nbsp; <br />
    </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;GetMember!(Foo,&nbsp;<span class="string">&quot;n&quot;</span><span>)&nbsp;=&nbsp;2;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(<span class="string">&quot;Foo.n=&quot;</span><span>,&nbsp;Foo.n);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;GetMember!(Foo,&nbsp;<span class="string">&quot;add&quot;</span><span>)(12,&nbsp;34);&nbsp;</span><span class="comment">//调用&nbsp;Foo.add()</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
参考： http://www.digitalmars.com/d/traits.html<br />
特别要指出的是 is(typeof(Aggr.member)) 的用法及 alias 模板参数重载来自于 redsea 兄 <img alt="" src="/javascripts/fckeditor/editor/images/smiley/msn/tounge_smile.gif" />
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/129917#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Oct 2007 23:12:44 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/129917</link>
        <guid>http://oldrev.javaeye.com/blog/129917</guid>
      </item>
          <item>
        <title>VCF 库的搞笑提示</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/129877" style="color:red;">http://oldrev.javaeye.com/blog/129877</a>&nbsp;
          发表时间: 2007年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看截图：
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/129877#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Oct 2007 20:07:56 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/129877</link>
        <guid>http://oldrev.javaeye.com/blog/129877</guid>
      </item>
          <item>
        <title>更好的C++——给C++使用者的D语言简介</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/123677" style="color:red;">http://oldrev.javaeye.com/blog/123677</a>&nbsp;
          发表时间: 2007年09月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>作为 C++ 狂热的粉丝，你在多年使用C++的过程中是否有过以下症状：</p>
<ol>
    <li>Boost 和 STL 真不错，但是编译太慢，让我想砸电脑！</li>
    <li>我讨厌一个程序写两次，干嘛要头文件？编译器不会自动提取声明吗？</li>
    <li>经常有大师教导你不要用宏，但是现实是没有那个程序不用！</li>
    <li>我从来不喜欢指针，但我也不想失去它</li>
    <li>我想要垃圾回收!!!</li>
    <li>C++的元编程真酷，我也想试试，但我是凡人。<br />
    </li>
    <li>多继承、虚继承太复杂，我想要 interface，但是有能保持多继承的威力。</li>
    <li>羡慕 C# 的Property、delegate...?</li>
    <li>大师们说要用RAII，但是我觉得麻烦，为清理个资源居然要写个临时类？</li>
    <li>...</li>
</ol>
<p><br />
如果以上问题你都回答Y，那么，我建议你去看看D语言（<a href="http://www.digitalmars.com/d">www.digitalmars.com/d/</a>）医生，他将为你开出以下处方：<br />
<br />
</p>
<ol>
    <li>DMD/GDC D语言编译器编译速度飞快，用再多的模板也不成问题，一个 几MB代码的程序的编译也可以在分秒内完成。</li>
    <li>D语言提供了模块(module)和包(package)的概念，一个模块就是一个源文件，一个包就是一个磁盘目录，解决了程序的物理架构问题。更妙的是，编译器能自动提取所有声明和接口，完全没有 C/C++ 头文件的麻烦。</li>
    <li>D语言没有C/C++中的文本宏，这下你该高兴了吧？而且很快 D语言2.0 Alpha 版本中将提供基于抽象语法树(AST)的宏，让你能在一致的语言环境中操纵甚至自定义语法。</li>
    <li>D的许多特性大大减少了指针的需要，比如与C#/Java 类似类默认就是引用类型，D也有内置动态数组。但是 D也保留了指针，因为你需要解决现实世界的问题。</li>
    <li>D拥有内置的GC，但是你也可以重在类的 new 操作符来避开GC。D 也不是虚拟机语言，而是像 C++ 一样着眼于大规模高性能的系统和应用程序。<br />
    </li>
    <li>D 的模板与元编程（这是&ldquo;与&rdquo;，因为D的元编程不仅限于使用模板）是面向凡人的，远比C++的易于学习使用，但是功能强于 C++，甚至可以在编译时执行函数。</li>
    <li>D拥有一切现代面向对象语言的要素：interface, abstract class, final class...，为了解决 interface + 单继承的不足，D 提供了模板混入（template mix-in）特性，没错，天上不会掉馅饼，但是可能会掉红宝石。<br />
    </li>
    <li>D 拥有恐怕是世界上最简单的 Property 功能，比如：
    <div class="code_title">D 代码</div>
    <div class="dp-highlighter">
    <div class="bar">&nbsp;</div>
    <ol start="1" class="dp-j">
        <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Foo{&nbsp;&nbsp;&nbsp; <br />
        </span></span></li>
        <li class="alt"><span><span></span><span class="keyword">&nbsp; int</span><span>&nbsp;c;&nbsp;&nbsp;&nbsp; <br />
        </span></span></li>
        <li class="alt"><span><span><br />
        </span></span></li>
        <li class="alt"><span><span></span><span class="keyword">&nbsp; int</span><span>&nbsp;count() { <br />
        </span></span></li>
        <li class="alt"><span><span></span><span class="keyword">&nbsp;&nbsp;&nbsp; return</span><span>&nbsp;c; <br />
        </span></span></li>
        <li class="alt"><span><span>&nbsp; }</span></span></li>
        <li class="alt"><span><span><br />
        </span></span></li>
        <li class="alt"><span><span>&nbsp; void count(int n) {</span></span></li>
        <li class="alt"><span><span>&nbsp;&nbsp;&nbsp; c = n;</span></span></li>
        <li class="alt"><span><span>&nbsp; }<br />
        </span></span></li>
        <li class="alt"><span><span>}&nbsp;&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <span> </span>现在类Foo 的成员函数 count 可以像一个真正的属性一样地被访问： int x = foo.count; 或者 foo.count = 123;<br />
    </li>
    <li>    D 的 delegate 强于C#，完全由编译器内部支持，而不是如C++般笨拙、低效的手写代码。D 甚至允许完全的匿名 delegate： void delegate() d = { printf(&quot;Hi D!\n&quot;)};</li>
    <li>scope 是C#中 using 的加强版，实践 RAII 手法从此变得轻松愉快。<br />
    </li>
    <li>
    <p>C++ 界大牛人 Andrei Alexandrescu 参与了核心语言设计，加上经验丰富的编译器作者和一大堆活跃的开发者，D 的前途光明。</p>
    </li>
</ol>
<p><br />
D 是一门很年轻很有前途的语言，虽然现在还不算成熟，但是目前的 1.0 稳定版已经拥有了超越 C++0x 标准的特性。就像D的设计和实现者 Walter Bright 说的，看看它的文档，你自己决定吧！</p>
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/123677#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Sep 2007 01:30:00 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/123677</link>
        <guid>http://oldrev.javaeye.com/blog/123677</guid>
      </item>
          <item>
        <title>让D代码自己编译自己</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/123419" style="color:red;">http://oldrev.javaeye.com/blog/123419</a>&nbsp;
          发表时间: 2007年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>
<p><font size="1">刚在 D语言的新闻组里看到了D模板&amp;元编程顶尖高人 Don Clugston 的新作&mdash;&mdash;<a href="http://www.dsource.org/projects/mathextra/browser/trunk/blade/SyntaxTree.d">Compile time lex + parse + semantic = 300 lines of code</a></font><font size="1" face="Tahoma, Sans-Serif"><font face="Tahoma, Sans-Serif"> 一个用300行代码就实现的D语言编译时词法解析、语法解析、语义分析器，换句话说就是一个非常简单的编译器前端。</font></font></p>
</div>
<div>
<p><font size="1" face="Tahoma, Sans-Serif"><font face="Tahoma, Sans-Serif">当然了，这也不是什么新技术，C++ 借助一些模板递归也能实现出像 boost.spirit/boost.phoenix 这样的语法分析器，但是这个语法分析器只是在编译时生成，却不能在编译时运行。而 Don 的实现，借助了D 编译时函数执行（CTFE）的强大功能，能在编译时就完成解析，真是不可思议。</font></font></p>
</div>
<div>
<p><font size="1" face="Tahoma, Sans-Serif"><font face="Tahoma, Sans-Serif">Don 给出的例子：</font></font></p>
</div>
<p><font size="1" face="Tahoma, Sans-Serif"><font face="Tahoma, Sans-Serif"><br />
<div class="code_title"><font><font><font>D 代码</font></font></font></div>
<div class="dp-highlighter">
<ol class="dp-cpp" start="1"><font><font><font>
    <li class="alt"><span><span>import&nbsp;SyntaxTree;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">const</span><span>&nbsp;foo&nbsp;=&nbsp;&ldquo;abc&rdquo;;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="datatypes">int</span><span>&nbsp;bar(real&nbsp;x,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;[]&nbsp;s)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;}&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">struct</span><span>&nbsp;Duck{};&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Duck&nbsp;duck;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>AbstractSyntaxTree&nbsp;a&nbsp;=&nbsp;mixin(syntaxtreeof(`foo*&nbsp;&nbsp;&nbsp;bar(2.18_3242e+45L,&nbsp;&ldquo;xyz&rdquo;)&nbsp;in&nbsp;duck`));&nbsp;&nbsp;&nbsp;</span></li>
    </font></font></font></ol>
    </div>
    </font></font></p>
    <p><font size="1" face="Tahoma, Sans-Serif"><font face="Tahoma, Sans-Serif">这段代码在编译时，a 是一个编译时的常量，表达式</font></font><font size="1" face="Tahoma, Sans-Serif"><font face="Tahoma, Sans-Serif"><font><font><font><span>`foo*&nbsp;&nbsp;&nbsp;bar(2.18_3242e+45L,&nbsp;&ldquo;xyz&rdquo;)&nbsp;in&nbsp;duck`将被解析为 a 的子节点。</span></font></font></font></font></font></p>
    <p><font size="1">D快变成脚本了，不是吗？</font><font size="1" face="Tahoma, Sans-Serif"><font face="Tahoma, Sans-Serif"><font><font><font><span></span></font></font></font></font></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://oldrev.javaeye.com/blog/123419#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Sep 2007 22:55:46 +0800</pubDate>
        <link>http://oldrev.javaeye.com/blog/123419</link>
        <guid>http://oldrev.javaeye.com/blog/123419</guid>
      </item>
          <item>
        <title>Range Coding 的 D 实现</title>
        <author>oldrev</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://oldrev.javaeye.com">oldrev</a>&nbsp;
                    链接：<a href="http://oldrev.javaeye.com/blog/114138" style="color:red;">http://oldrev.javaeye.com/blog/114138</a>&nbsp;
          发表时间: 2007年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Range Coding 是算术编码的变种，二者的效率几乎没有差别，Range Coding 速度更快，且没有专利问题。下面的程序移植和改进自一个非常清晰简洁的C++实现。当然，直接使用下面的代码去压缩文件效果并不好，速度慢压缩率也低，Range Coding 更适合作为其他算法的后端，比如 LZ77、Block Sorting。<br />
<br />
如果你看到这里一头雾水的话，可以上 wikipedia 参考&ldquo;算术编码&rdquo;，不过更好的选择是找一篇名为《笨笨数据压缩教程》的系列文章来入门。<br />
<br />
<div class="code_title">D1.0 Code<br />
</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-cpp" start="1">
    <li class="alt"><span><span class="comment">/** Code for range coding, derived from public domain work by Dmitry Subbotin</span> </span></li>
    <li class=""><span><span class="comment">    Modified to use 64-bit integer maths, for increased precision</span> </span></li>
    <li class="alt"><span><span class="comment"></span> </span></li>
    <li class=""><span><span class="comment">Authors:    Dmitry Subbotin (initial author of the Carry-less Range Coder)</span> </span></li>
    <li class="alt"><span><span class="comment">            Sachin Garg (C++)</span> </span></li>
    <li class=""><span><span class="comment">            Wei Li (D language) </span> </span></li>
    <li class="alt"><span><span class="comment"></span> </span></li>
    <li class=""><span><span class="comment">Reference:  http://sachingarg.com/compression/entropy_coding/64bit/</span> </span></li>
    <li class="alt"><span><span class="comment">*/</span><span>  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>import std.stdio;  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="keyword">template</span><span> RangeCoding64Base()  </span></span></li>
    <li class=""><span>{  </span></li>
    <li class="alt"><span>    <span class="keyword">const</span><span> ulong Top = 1UL &lt;&lt; 56UL;  </span></span></li>
    <li class=""><span>    <span class="keyword">const</span><span> ulong Bottom = 1UL &lt;&lt; 48UL;  </span></span></li>
    <li class="alt"><span>    <span class="keyword">const</span><span> ulong MaxRange = Bottom;  </span></span></li>
    <li class=""><span>    ulong m_low = 0;  </span></li>
    <li class="alt"><span>    ulong m_range = ulong.max;  </span></li>
    <li class=""><span>}  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="keyword">struct</span><span> RangeEncoding64  </span></span></li>
    <li class="alt"><span>{  </span></li>
    <li class=""><span>    mixin RangeCoding64Base;  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">private</span><span> </span><span class="datatypes">bool</span><span> m_flushed = </span><span class="keyword">false</span><span>;  </span></span></li>
    <li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="keyword">void</span><span> delegate(ubyte) m_sink = null;  </span></span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">void</span><span> init(</span><span class="keyword">void</span><span> delegate(ubyte) sink)  </span></span></li>
    <li class=""><span>    {  </span></li>
    <li class="alt"><span>        assert(sink !is null);  </span></li>
    <li class=""><span>        m_sink = sink;  </span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">void</span><span> close()  </span></span></li>
    <li class=""><span>    {  </span></li>
    <li class="alt"><span>        <span class="keyword">if</span><span>(!m_flushed)  </span></span></li>
    <li class=""><span>            flush();  </span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>    <span class="keyword">void</span><span> encode(ulong symbolLow, ulong symbolHigh, ulong totalRange)  </span></span></li>
    <li class=""><span>    {  </span></li>
    <li class="alt"><span>        m_range /= totalRange;  </span></li>
    <li class=""><span>        m_low += symbolLow * m_range;  </span></li>
    <li class="alt"><span>        m_range *= symbolHigh - symbolLow;  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>        <span class="keyword">while</span><span> ((m_low ^ (m_low + m_range)) &lt; Top || m_range &lt; Bottom &amp;&amp; ((m_range = -m_low &amp; (Bottom - 1)), </span><span class="keyword">true</span><span>))  </span></span></li>
    <li class=""><span>        {  </span></li>
    <li class="alt"><span>            ubyte b = m_low &gt;&gt; (m_low.<span class="keyword">sizeof</span><span> * 8 - 8);  </span></span></li>
    <li class=""><span>            m_sink(b);  </span></li>
    <li class="alt"><span>            m_range &lt;&lt;= 8;  </span></li>
    <li class=""><span>            m_low &lt;&lt;= 8;  </span></li>
    <li class="alt"><span>        }  </span></li>
    <li class=""><span>    }  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span>    <span class="keyword">void</span><span> flush()  </span></span></li>
    <li class="alt"><span>    {  </span></li>
    <li class=""><span>        <span class="keyword">if</span><span>(!m_flushed)  </span></span></li>
    <li class="alt"><span>        {  </span></li>
    <li class=""><span>            <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i &lt; m_low.</span><span class="keyword">sizeof</span><span>; i++)  </span></span></li>
    <li class="alt"><span>            {  </span></li>
    <li class=""><span>                ubyte b = m_low &gt;&gt; (m_low.<span class="keyword">sizeof</span><span> * 8 - 8);  </span></span></li>
    <li class="alt"><span>                m_sink(b);  </span></li>
    <li class=""><span>                m_low &lt;&lt;= 8;  </span></li>
    <li class=