﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-qiezi的学习园地-随笔分类-学习方向</title><link>http://www.cppblog.com/cpunion/category/40.html</link><description>AS/C/C++/D/Java/JS/Python/Ruby</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 01:42:43 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 01:42:43 GMT</pubDate><ttl>60</ttl><item><title>ABI Specifications 相关链接</title><link>http://www.cppblog.com/cpunion/archive/2006/03/23/4493.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Thu, 23 Mar 2006 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2006/03/23/4493.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/4493.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2006/03/23/4493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/4493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/4493.html</trackback:ping><description><![CDATA[Itanium C++ ABI ($Revision: 1.86 $)<br />http://www.codesourcery.com/cxx-abi/abi.html<br /><br />C++ ABI Summary<br />http://www.codesourcery.com/cxx-abi/<br /><br />C++ ABI for IA-64: Code and Implementation Examples<br />http://www.codesourcery.com/cxx-abi/abi-examples.html<br /><br />C++ Vtable Example<br />http://www.codesourcery.com/cxx-abi/cxx-vtable-ex.html<br /><br /><br /><br />
Intel® Itanium® Processor-specific Application Binary Interface (ABI)<br />
http://developer.intel.com/design/itanium/downloads/245370.htm<br /><img src ="http://www.cppblog.com/cpunion/aggbug/4493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2006-03-23 16:08 <a href="http://www.cppblog.com/cpunion/archive/2006/03/23/4493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DMD 0.141发布</title><link>http://www.cppblog.com/cpunion/archive/2005/12/06/1558.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Tue, 06 Dec 2005 02:41:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/12/06/1558.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/1558.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/12/06/1558.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/1558.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/1558.html</trackback:ping><description><![CDATA[<H3><A name=new0141>What's New for <A title="D 0.141" href="http://ftp.digitalmars.com/dmd.141.zip">D 0.141</A> </H3>
<P><SMALL><I>Dec 1, 2005</I></SMALL> </P>
<P>
<H4>New/Changed Features</H4>
<UL>
<LI>The predefined version identifier <B>D_InlineAsm</B> has been changed to <B>D_InlineAsm_X86</B>. The former made no sense, and although it is still defined, it is deprecated. 
<LI>Added <A href="http://digitalmars.com/d/code_coverage.html">D code coverage analyzer</A>. 
<LI>Added <B>.mangleof</B> property for types, which gives the 'mangled' type name as a string. </LI></UL>
<H4>Bugs Fixed</H4>
<UL>
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5643">D.bugs/5643</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5668">D.bugs/5668</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5687">D.bugs/5687</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5690">D.bugs/5690</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5673">D.bugs/5673</A> (it now issues an <B>OutOfMemoryException</B>) 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5729">D.bugs/5729</A> 
<LI>Fixed dstress.run.c.creal_26_A regression. 
<LI>Fixed dstress.run.const_18 regression. </LI></UL>
<P><BR><BR>其中“D代码覆盖分析器”应该是很多人感兴趣的东西了，下面是一个例子(摘自<A href="http://digitalmars.com/d/code_coverage.html">http://digitalmars.com/d/code_coverage.html</A>)：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;Eratosthenes&nbsp;Sieve&nbsp;prime&nbsp;number&nbsp;calculation.&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;<BR>bit&nbsp;flags[</SPAN><SPAN style="COLOR: #000000">8191</SPAN><SPAN style="COLOR: #000000">];<BR>&nbsp;<BR></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main()<BR>{&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,&nbsp;prime,&nbsp;k,&nbsp;count,&nbsp;iter;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">10&nbsp;iterations\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(iter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;&nbsp;iter&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">;&nbsp;iter</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;flags[]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;flags.length;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(flags[i])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;prime&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;prime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">&nbsp;(k&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;flags.length)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flags[k]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;prime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\n%d&nbsp;primes\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;count);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR>}<BR></SPAN></DIV><BR>编译、运行：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">dmd&nbsp;sieve&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">cov<BR>sieve</SPAN></DIV>结果如下：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |/* Eratosthenes Sieve prime number calculation. */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |bit flags[8191];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |int main()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5|{&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; i, prime, k, count, iter;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1|&nbsp;&nbsp;&nbsp; printf("10 iterations\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp; 22|&nbsp;&nbsp;&nbsp; for (iter = 1; iter &lt;= 10; iter++)<BR>&nbsp;&nbsp;&nbsp;&nbsp; 10|&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; count = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp; 10|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flags[] = true;<BR> 163840|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; flags.length; i++)<BR>&nbsp; 81910|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; if (flags[i])<BR>&nbsp; 18990|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; prime = i + i + 3;<BR>&nbsp; 18990|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = i + prime;<BR> 168980|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (k &lt; flags.length)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR> 149990|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flags[k] = false;<BR> 149990|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k += prime;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp; 18990|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count += 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1|&nbsp;&nbsp;&nbsp; printf ("\n%d primes\n", count);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1|&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |}<BR>sieve.d is 100% covered<BR></DIV><BR>另一个惊喜是mangleof属性，可以得到一个类型被编译器mangle后的名字。不知道mangle对应的中文翻译是什么？大概是“名字转换”吧。一点测试代码：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">import&nbsp;std.stdio;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test();<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test1(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n);<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test2(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n);<BR><BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;function&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">[])&nbsp;f;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;function&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">)&nbsp;f1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;function&nbsp;()&nbsp;f2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(f.mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(f1.mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(f2.mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">.mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;a;<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(a.mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;((</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">test).mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;((</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">test1).mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;((</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">test2).mangleof);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">.mangleof);<BR>}</SPAN></DIV>编译执行结果如下：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">PFiAaZv<BR>PFiZv<BR>PFZv<BR>i<BR>f<BR>PFZv<BR>PFiZv<BR>PFiZv<BR>v</SPAN></DIV><img src ="http://www.cppblog.com/cpunion/aggbug/1558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-12-06 10:41 <a href="http://www.cppblog.com/cpunion/archive/2005/12/06/1558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DMD 0.140发布</title><link>http://www.cppblog.com/cpunion/archive/2005/11/25/1304.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Fri, 25 Nov 2005 05:38:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/25/1304.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/1304.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/25/1304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/1304.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/1304.html</trackback:ping><description><![CDATA[<EM><FONT size=2>Nov 23, 2005</FONT></EM> 
<P>
<H4>New/Changed Features</H4>
<UL>
<LI>Added <B>std.string.soundex</B>. 
<LI>Added <B>std.string.entab</B>. 
<LI>Added <B>std.string.wrap</B>. 
<LI>Added <B>std.string.abbrev</B>. 
<LI>Added <A href="http://www.digitalmars.com/d/phobos/std_windows_charset.html">std.windows.charset</A> (thanks to Stewart Gordon, <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D/28246">D/28246</A>). 
<LI>Added <A href="http://www.digitalmars.com/d/phobos/std_demangle.html">std.demangle</A> to demangle D names. 
<LI>Improved promotion of names inside templates. 
<LI>Now allows floating point and string literals as template value arguments. 
<LI>To support the previous, the name mangling of template instances has changed. This will necessitate recompilation of any code that uses templates. 
<LI>std.utf.UtfError is now deprecated. Use std.utf.UtfException instead. </LI></UL>
<H4>Bugs Fixed</H4>
<UL>
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5299">D.bugs/5299</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5353">D.bugs/5353</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5360">D.bugs/5360</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5391">D.bugs/5391</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5429">D.bugs/5429</A> 
<LI>Fixed <A href="http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D.bugs/5464">D.bugs/5464</A> 
<LI>Fixed <B>std.string.expandtabs</B> so it handles UTF. </LI></UL>
<P><BR>比较感兴趣的是浮点数和字符串常量作为模板值参数，简单测试了一下：<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">import&nbsp;std.stdio;<BR><BR>template&nbsp;TFloat&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;F)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;F;<BR>}<BR><BR>template&nbsp;TString&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">[]&nbsp;S)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">[]&nbsp;value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;S;<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;TFloat</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">3.14f</SPAN><SPAN style="COLOR: #000000">)&nbsp;PI;<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln(PI.value);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln(TString</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).value);<BR>}</SPAN></DIV><BR>编译通过，运行结果如下：<BR><BR>3.14<BR>hello<img src ="http://www.cppblog.com/cpunion/aggbug/1304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-25 13:38 <a href="http://www.cppblog.com/cpunion/archive/2005/11/25/1304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DMDScript脚本工具，DDL项目</title><link>http://www.cppblog.com/cpunion/archive/2005/11/20/1200.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Sat, 19 Nov 2005 16:20:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/20/1200.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/1200.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/20/1200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/1200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/1200.html</trackback:ping><description><![CDATA[DMDScript是Digital Mars提供的一个符合ECMA 262规范的脚本语言，采用D语言编写，开放源代码，可以从<A href="http://www.digitalmars.com/dscript">http://www.digitalmars.com/dscript</A>看到详细信息，另外有一个C++的实现版本。<BR><BR>另外2个符合ECMA 262规范的脚本语言分别是Netscape的javascript和Microsoft的JScript，目前DMDScript和其它2个不完全兼容，不过效率要高一些。DMDScript提供了一个简单的测试，生成8190以内的质数，迭代10次，在我的机器上，javascript执行耗时566毫秒，DMDScript执行耗时188毫秒，整整快了3倍。<BR><BR>如果你想实现一个符合ECMA 262标准的脚本语言，建议看这份代码的实现吧，比较简洁，只有400多K。微软那份估计是很难看到了，Netscape那份用C写的，代码大小就有近3M，宏也比较多，看起来要吃力一些。<BR><BR><BR><BR>DDL是dsource.org上的一个有趣的项目，它可以从.obj或.lib文件中加载代码并执行，目前支持COFF、OMF、ELF格式。<img src ="http://www.cppblog.com/cpunion/aggbug/1200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-20 00:20 <a href="http://www.cppblog.com/cpunion/archive/2005/11/20/1200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D语言的模板</title><link>http://www.cppblog.com/cpunion/archive/2005/11/11/1083.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Fri, 11 Nov 2005 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/11/1083.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/1083.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/11/1083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/1083.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/1083.html</trackback:ping><description><![CDATA[D语言的模板使用非常方便灵活，受够了C＋＋模板编写之苦的同学们可以感受一下D语言的模板，下面先展示一个D语言编写的多分派委托类，在我的旧BLOG上曾经写过一个C＋＋版本的，整个过程感觉非常痛苦。。。<BR><BR>闲话少说，请看代码：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">import&nbsp;std.stdio;<BR><BR><BR>template&nbsp;DelegateHandlers(HandlerType,&nbsp;FunctionType)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;HandlerType[]&nbsp;handlers;<BR>&nbsp;&nbsp;&nbsp;&nbsp;FunctionType[]&nbsp;functions;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;opAddAssign(HandlerType&nbsp;h)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handlers.length&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;handlers.length&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handlers[length</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;h;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;opAddAssign(FunctionType&nbsp;f)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functions.length&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;functions.length&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functions[length</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">]&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;f;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>template&nbsp;Delegate(Ret)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Delegate<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Ret&nbsp;</SPAN><SPAN style="COLOR: #0000ff">delegate</SPAN><SPAN style="COLOR: #000000">&nbsp;()&nbsp;HandlerType;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Ret&nbsp;function&nbsp;()&nbsp;FunctionType;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mixin&nbsp;DelegateHandlers</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(HandlerType,&nbsp;FunctionType);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">is</SPAN><SPAN style="COLOR: #000000">(Ret:&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;opCall&nbsp;()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(HandlerType&nbsp;handler;&nbsp;handlers)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler&nbsp;();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(FunctionType&nbsp;_function;&nbsp;functions)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_function&nbsp;();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ret&nbsp;opCall&nbsp;()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ret&nbsp;ret;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(HandlerType&nbsp;handler;&nbsp;handlers)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;handler&nbsp;();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(FunctionType&nbsp;_function;&nbsp;functions)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;_function&nbsp;();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;ret;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>template&nbsp;Delegate(Ret,&nbsp;Arg1)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Delegate<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Ret&nbsp;</SPAN><SPAN style="COLOR: #0000ff">delegate</SPAN><SPAN style="COLOR: #000000">&nbsp;(Arg1)&nbsp;HandlerType;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Ret&nbsp;function&nbsp;(Arg1)&nbsp;FunctionType;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mixin&nbsp;DelegateHandlers</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(HandlerType,&nbsp;FunctionType);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">is</SPAN><SPAN style="COLOR: #000000">(Ret:&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;opCall&nbsp;(Arg1&nbsp;a1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(HandlerType&nbsp;handler;&nbsp;handlers)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler&nbsp;(a1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(FunctionType&nbsp;_function;&nbsp;functions)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_function&nbsp;(a1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ret&nbsp;opCall&nbsp;(Arg1&nbsp;a1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ret&nbsp;ret;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(HandlerType&nbsp;handler;&nbsp;handlers)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;handler&nbsp;(a1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(FunctionType&nbsp;_function;&nbsp;functions)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;_function&nbsp;(a1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;ret;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR><BR></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Test<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test&nbsp;()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Test.test</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;test1&nbsp;()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Test.test1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test2(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;v)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Test.test2</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;test3(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;v)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Test.test3</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">7</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test_func&nbsp;()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test_func</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>}<BR></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;test_func1&nbsp;()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test_func1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">;<BR>}<BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test_func2(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;v)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test_func2</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>}<BR></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;test_func3(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;v)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test_func3</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">9</SPAN><SPAN style="COLOR: #000000">;<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;t&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Test;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Delegate</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">)&nbsp;DDD;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DDD&nbsp;d&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DDD;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">t.test;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">test_func;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Delegate</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">)&nbsp;DDD1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DDD1&nbsp;d1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DDD1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d1&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">t.test1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d1&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">test_func1;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;a&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;d1&nbsp;();<BR>&nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;(a&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Delegate</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">)&nbsp;DDD2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DDD2&nbsp;d2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DDD2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d2&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">t.test2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d2&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">test_func2;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;d2&nbsp;(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;Delegate</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">)&nbsp;DDD3;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DDD3&nbsp;d3&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;DDD3;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d3&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">t.test3;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d3&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">test_func3;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;b&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;d3&nbsp;(</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;(b&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">9</SPAN><SPAN style="COLOR: #000000">);<BR>}<BR></SPAN></DIV><BR>非常干净，非常简洁，不是吗？这个只花了我10分钟时间来写。。。<BR><BR>D语言的委托非常高效，有兴趣的可以测试一下通过委托和直接调用之间的性能差别。上面这个自己实现的多分派委托类，效率也非常高，我的测试结果是对于性能的影响几乎可以忽略。想起那个历尽千辛万苦实现的C＋＋多分派委托类，实现复杂、调试费时、运行效率还很低，每每一想到这心里那个难受啊。。。。<BR><BR>再来看一下D语言强大的静态检查机制：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">template&nbsp;XXX&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;v)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;v;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;assert&nbsp;(v&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">);<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main&nbsp;()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n;<BR>&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;XXX</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">).n;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;OK</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;XXX</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">).n;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;编译错误</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">}</SPAN></DIV><BR>同样很漂亮。<BR><BR>如果你觉得提示信息不够友好，可以修改为：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">template&nbsp;XXX&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;v)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;v;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(v&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pragma&nbsp;(msg,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">template&nbsp;value&nbsp;must&nbsp;&gt;&nbsp;3</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;assert&nbsp;(v&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">);<BR>}</SPAN></DIV><BR>这是编译时的错误提示：<BR><BR>Compiling test.d ...<BR>template value must &gt; 3<BR>D:\workspace\dace\test.d(94): static assert&nbsp; (3 &gt; 3) is false<BR>D:\workspace\dace\test.d(173): template instance test.XXX!(3) error instantiating<BR><BR>我想以后有可能会扩充pragma，支持错误输出，这样就不用写重复的语句了，可以简化成这样：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">template&nbsp;XXX&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;v)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;v;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(v&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pragma&nbsp;(error,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">template&nbsp;value&nbsp;must&nbsp;&gt;&nbsp;3</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>}</SPAN></DIV><BR>这样看起来更好。不过目前有很多重要特性要实现，这种玩意可能要很久以后才会加入了。<img src ="http://www.cppblog.com/cpunion/aggbug/1083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-11 17:13 <a href="http://www.cppblog.com/cpunion/archive/2005/11/11/1083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D语言调用ActiveX（在窗口中嵌入ActiveX）</title><link>http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Fri, 11 Nov 2005 04:16:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/1061.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/1061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/1061.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是一个从C移植到D的代码，原文请见“Embed an HTML control in your own window using plain C”，它用C结构模拟了虚表，并且实现了多个接口以完成对Web Browser控件的调用。在看完他的代码之后，我对于COM/OLE的了解加深了一些，以前使用VC做过COM方面的应用，也看过不少COM方面的书，不过没有涉及到界面，所以一直不知道如何把Activ...&nbsp;&nbsp;<a href='http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html'>阅读全文</a><img src ="http://www.cppblog.com/cpunion/aggbug/1061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-11 12:16 <a href="http://www.cppblog.com/cpunion/archive/2005/11/11/1061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D语言中的in/inout/out参数</title><link>http://www.cppblog.com/cpunion/archive/2005/11/10/1044.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Thu, 10 Nov 2005 06:51:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/10/1044.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/1044.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/10/1044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/1044.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/1044.html</trackback:ping><description><![CDATA[<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;import&nbsp;std.stdio,&nbsp;std.process;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;a,&nbsp;inout&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;b,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;c)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln(a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln(b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln(c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">7</SPAN><SPAN style="COLOR: #000000">;<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main&nbsp;()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;a&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;b&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;c&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;test(a,&nbsp;b,&nbsp;c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;(a&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;(b&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;(c&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">7</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;std.process.system(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">pause</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>}</SPAN></DIV><BR>在上面的例子里，程序在test函数中的输出语句将输出：<BR>0<BR>1<BR>0<BR>也就是说，out参数取值是无意义的，它只用于赋值。<BR><BR>这里有一个很大的问题，调用test(a,b,c)时，调用者对于c的值被改变可能毫无知觉，甚至成为隐藏很深的BUG。对此，许多人建议加强检查，比如在调用时，必须指明inout/out：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">test(a,&nbsp;inout&nbsp;b,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">&nbsp;c);</SPAN></DIV><BR>似乎能够起到一些警示作用，不过这样一来，语法上倒不怎么简练了。<img src ="http://www.cppblog.com/cpunion/aggbug/1044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-10 14:51 <a href="http://www.cppblog.com/cpunion/archive/2005/11/10/1044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DMD最近的一些更新</title><link>http://www.cppblog.com/cpunion/archive/2005/11/10/1039.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Thu, 10 Nov 2005 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/10/1039.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/1039.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/10/1039.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/1039.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/1039.html</trackback:ping><description><![CDATA[v0.138 实现了字符串直接切片调用：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">[]&nbsp;a&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abcde</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">..</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">];<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln(a);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;b&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abcde</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">];<BR>&nbsp;&nbsp;&nbsp;&nbsp;writefln(b);</SPAN></DIV><BR>另外修复了一些编译器和文档生成的BUG。<BR><BR>v0.137的重要更新有：<BR>隐式类型引用：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">auto&nbsp;c&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">abcde</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;c变量自动获得类型char[]</SPAN></DIV>extern(linkage)在内嵌函数中使用<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;test()<BR>{<BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">extern</SPAN><SPAN style="COLOR: #000000">(C)&nbsp;test1();<BR>}</SPAN></DIV><BR><BR>其它更新则主要集中于编译器工作、文档工具、库等，暂时还没有特别令人兴奋的特性加入进来，比如：stack tracing, relation api等。<img src ="http://www.cppblog.com/cpunion/aggbug/1039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-10 12:12 <a href="http://www.cppblog.com/cpunion/archive/2005/11/10/1039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D语言令人喜爱的几个地方</title><link>http://www.cppblog.com/cpunion/archive/2005/11/02/902.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Wed, 02 Nov 2005 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/02/902.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/902.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/02/902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/902.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/902.html</trackback:ping><description><![CDATA[1、去掉了丑陋的宏。<BR>C/C++中的宏是很令人厌烦的，D不允许再使用它。<BR><BR>2、好用的字符串常量表达式。<BR>除了类C的使用双引号的字符串常量表达式以外，还可以使用`字符。可以使用x"68 65 6C6C 6F"来表示"hello"，r"ab\na"则忽略字符串常量中转义字符的转义作用，还可以在字符串常量后加上c, w或d来指示字符串常量是char[]类型、wchar[]类型还是dchar[]类型。可以使用~运算符连接2个字符串。<BR><BR>3、数字。<BR>数字可以直接使用，还可以这样来定义：int a = 3_029_301_000; 数字直接量(包括整数、浮点数、复数)表达式中，“_”字符是被忽略的。另外还直接提供了复数类型。<BR><BR>4、提供定长数组、变长数组、关联数组。<BR>int[3] a定义一个定长数组；int [] a定义一个变长数组；int[int]定义一个关联数组，键类型是int，值类型是int；int[char[]] a定义一个关联数组，键类型是char[]，值类型是int，使用非常方便。<BR>可以使用foreach来遍历数组：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;index,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;value;&nbsp;a)<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;printf&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%d:&nbsp;%d\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;index,&nbsp;value);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">[]&nbsp;key,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;value;&nbsp;a)<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;printf&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%.*s:&nbsp;%d\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;index,&nbsp;value);</SPAN></DIV><BR>可以使用in操作符来判断某个值是否是关联数组的一个键：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">[]]&nbsp;a;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">&nbsp;a)<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV><BR>数组可以切片(slice)：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;a;&nbsp;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;b&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;a[</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">..</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">];&nbsp;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">[]&nbsp;c&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;a[</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">..length];</SPAN></DIV><BR>等等。。。。<BR><BR>5、其它还支持委托、函数指针、模板、异常、RAII、契约式编程、单元测试、with语句、auto/typeof、垃圾回收、操作符重载、内联汇编、条件编译、嵌入到HTML等，它还标准化了ABI(这是C/C++最让人头痛的地方之一)。这些特性大部分都比较熟悉和实用，下面简单介绍一下条件编译和嵌入到HTML。<BR><BR>6、条件编译。<BR>在D中，可以使用version(VersionID)来进行条件编译：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">version&nbsp;(Win32)<BR>{<BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">}<BR></SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>{<BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">..</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">}</SPAN></DIV><BR>还可以使用debug条件：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">debug<BR>{<BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">}<BR></SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>{<BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">}</SPAN></DIV><BR>或者：<BR>debug printf ("hello");<BR>静态条件编译：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(n&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">world</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV><BR>类型检查：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;n&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">is</SPAN><SPAN style="COLOR: #000000">(n[]))<BR>&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">like&nbsp;array</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">is</SPAN><SPAN style="COLOR: #000000">(n:</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">))<BR>&nbsp;&nbsp;writefln&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">is&nbsp;an&nbsp;integer</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV><BR><BR>7、嵌入HTML。<BR>在一个HTML文件中，&lt;code&gt;和&lt;/code&gt;之间的部分可以当作D代码来编译。比如下面这段代码：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">h1</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">This&nbsp;is&nbsp;a&nbsp;test</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">h1</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">code</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>import&nbsp;std.c.stdio;<BR><BR>int&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">font&nbsp;</SPAN><SPAN style="COLOR: #ff0000">size</SPAN><SPAN style="COLOR: #0000ff">=+1</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">b</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">main</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">b</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">font</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">()<BR>{<BR></SPAN><SPAN style="COLOR: #ff0000">&amp;nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">span&nbsp;</SPAN><SPAN style="COLOR: #ff0000">style</SPAN><SPAN style="COLOR: #0000ff">="color:red"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">printf</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">span</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">u</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #ff0000">&amp;quot;</SPAN><SPAN style="COLOR: #000000">hello&nbsp;world\n</SPAN><SPAN style="COLOR: #ff0000">&amp;quot;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">u</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #ff0000">&amp;nbsp;</SPAN><SPAN style="COLOR: #000000">return&nbsp;0;<BR>}<BR></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">code</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">hr&nbsp;</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">h1</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;End&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">h1</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV><BR>把它存储为HTML文件，可以直接使用dmd编译器编译。<img src ="http://www.cppblog.com/cpunion/aggbug/902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-02 16:35 <a href="http://www.cppblog.com/cpunion/archive/2005/11/02/902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置D语言编程环境</title><link>http://www.cppblog.com/cpunion/archive/2005/11/02/892.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Wed, 02 Nov 2005 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/11/02/892.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/892.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/11/02/892.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/892.html</trackback:ping><description><![CDATA[D语言是由Walter Bright开发的，他也是Symantec C++编译器的作者，仅凭这一点就知道D语言一定不错。<BR><BR>D语言的介绍最好是看<A href="http://blog.csdn.net/uframer">uframer的blog</A>，他翻译了D语言的大部分文档。当然由于D语言目前一直处于测试版，文档和最新的编译器之间可能有很多不一致。<BR><BR>D语言的编译器目前有2个，DMD和GDC，DMD比较容易配置，可以从<A href="http://www.digitalmars.com/d/dcompiler.html">http://www.digitalmars.com/d/dcompiler.html</A>下载最新版。下载的压缩包直接解压到任意一个分区的根目录，并把\dm\bin和\dmd\bin加到PATH环境变量里即可使用。<BR><BR>写一个简单的D语言程序，当然还是经典的HelloWorld程序：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main&nbsp;()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;world!\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>}</SPAN></DIV><BR>和C程序基本上一样。把它保存为hello_world.d。<BR><BR>下面直接在这个源文件所在的目录下，执行dmd hello_world.d，即可编译出hello_world.exe，执行它就能在控制台打印出Hello world!。<BR><BR>接下来到<A href="http://www.dsource.org/projects/build/">http://www.dsource.org/projects/build/</A>下载build程序，这是在D社区使用比较广泛的一个程序。由于最新的v2.09版已经发现了一些严重的BUG，所以最好到<A href="http://svn.dsource.org/projects/build/downloads/">http://svn.dsource.org/projects/build/downloads/</A>下载v2.08版。把下载的.exe文件改名为build.exe并放置合适的文件夹下，并设置PATH环境变量。(为简单起见我是直接把它放在\dm\bin文件夹下)<BR><BR>下面测试一下build程序，编写一个hello_world.brf文件，保存在hello_world.d同一路径下，文件内容如下：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">cleanup<BR>hello_world.d</SPAN></DIV>
<P><BR>然后执行build @hello_world即可编译出hello_world.exe。</P>
<P>akIDE是一个D语言的IDE，可以到<A href="http://www.lessequal.com/akide">http://www.lessequal.com/akide</A>下载，它只需要DMD支持。<BR><BR>D语言编译速度非常快(这也是Walter Bright对C++不满的一个重要原因)。dsource.org中的mango项目包含755个D源文件，但在我的机器上编译成.lib文件只需要4秒时间。<BR><BR>D语言性能也很不错，有2篇D语言和C/C++、Java、C#的性能比较文章：<A href="http://mag.vchelp.net/200312/fanyi.htm"><BR>http://mag.vchelp.net/200312/fanyi.htm</A><BR><A href="http://mag.vchelp.net/200312/fanyi_2.htm">http://mag.vchelp.net/200312/fanyi_2.htm</A><BR><BR>相关项目介绍：<BR>mango: 这是一个专注于服务端编程的项目，目前主要由Kris开发、维护，实现了servlet，暂时还没有太复杂的功能，不过很值得期待。<BR>dwt: D语言的swt开发包，界面开发首选。看过eclipse界面的应该有比较深的印象。由于大部分代码是从java代码转换过来的，所以类名、接口等都没有改变。<BR>dui: D语言的别一个界面开发包，基于GTK。<BR>build: 上面介绍过的build工具。<BR>dcoder: 基于vs.net的D语言语法高亮插件。<BR>dsp: 全称是Dynamic Servlet Pages。<BR><BR>以上项目都可以在<A href="http://www.dsource.org/projects/">http://www.dsource.org/projects/</A>找到详细资料。<BR><BR>DMDScript是一个类似于JavaScript的脚本系统，可以在<A href="http://www.digitalmars.com/dscript/">http://www.digitalmars.com/dscript/</A>找到详细资料，这个我还没有使用过。<BR><BR><BR>最后附上2个使用dwt开发的界面<STRONG><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff0000>(注：由于本人不习惯安装杀毒软件，下载请先杀毒)：</FONT></STRONG><BR>1、仿eclipse界面：<BR><A href="/Files/cpunion/dummyeclipse.rar">http://www.cppblog.com/Files/cpunion/dummyeclipse.rar</A><BR>2、dwt控件演示：<BR><A href="/Files/cpunion/controlexample.rar">http://www.cppblog.com/Files/cpunion/controlexample.rar</A><BR><BR>在windows xp主题下效果比较好。这2个程序在我的机器上分别只占6.4M和7.2M内存，启动时间也不足1秒，不要被eclipse的启动时间吓坏了。<BR><BR>
<HR>
<BR>找到了这2张图：<BR><IMG height=607 alt=controlexample.png src="http://www.cppblog.com/images/cppblog_com/cpunion/myimages/controlexample.png" width=794 border=0><IMG height=380 alt=dummyeclipse.png src="http://www.cppblog.com/images/cppblog_com/cpunion/myimages/dummyeclipse.png" width=497 border=0></P><img src ="http://www.cppblog.com/cpunion/aggbug/892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-11-02 11:17 <a href="http://www.cppblog.com/cpunion/archive/2005/11/02/892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近比较忙</title><link>http://www.cppblog.com/cpunion/archive/2005/10/08/595.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Sat, 08 Oct 2005 15:15:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/10/08/595.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/595.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/10/08/595.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/595.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/595.html</trackback:ping><description><![CDATA[工作忙，学习也忙。<BR><BR>1、Ruby on Rails<BR><BR>前阵子看了一下Ruby on Rails，不禁为其深深折服，为Ruby，也为Rails。<BR><BR>照着Four Days on Rails做了一遍，虽然对Ruby不甚熟悉，不过一路下来感觉非常轻松，在搞明白:xxx和"xxx"是同一个意思以后，终于能看懂大部分代码了，也为这种语法叫好，要知道很多时候引号并不好用，当出现嵌套的时候。<FONT style="BACKGROUND-COLOR: #a9a9a9">(注：在Ruby里，"hello, #{user[:name]}"表示把user["name"]的值放到那个引号里面，这样做可以不仔细去考虑是不是使用单引号)</FONT><BR><BR>接着试了一下typo，一个ruby写的blog程序，看到它具有登录功能，而在4 days中并没有看到，于是找了相关资料，原来Rails中已经有这东西了，简单查看了文档以后，就为4 days中的那个演示项目加上了登录功能，前后不过十来分钟。<BR><BR>这样看来，一个人要做一个blog程序，大概2-3小时就够了，包括编写数据库模式、生成管理者使用的MVC结构(具有添加修改删除等功能)、添加登录功能，在此基础上再生成一个Controller，简单修改就能改成供其它用户使用的阅读界面，再稍费点神就能加上评论功能了。当然离标准的blog程序还有段距离，比如还不支持RSS，不过自己用来写点东西记点笔记什么的，足够用了。<BR><BR>2、Ajax on Rails<BR><BR>接着学习了Ajax on Rails，非常好用的东东，文档并不是很多，简单看了一下，觉得离我的想法还有点距离。我希望是可以实现像Gmail一样，读取一些变量过来，在页面上动态生成元素，而不是读取其它页面并把其中的元素替换掉当前页面上的元素，或者是添加到当前页面上这么简单。我查看过Gmail界面的源代码，好像是使用过混淆器，不过还是可以看出来，它是从服务端读取一些变量，读到客户端再把它转成可视的元素。<BR><BR>微软的space.msn.com在注册时，有一个验证码，当你看不清时可以点击右边的按钮再换一个验证码，这时只会刷新验证码而不用刷新整个页面，这种东西使用Ajax on Rails应该很轻松就可以完成。不过我还不知道在Rails中如何生成验证码呢，应该是使用其它的库来生成吧，有空查一下看看。<BR><BR>3、Ruby and Rails<BR><BR>Ruby的语法对于我这样的初学者(实际上并未正式学习)来说，有些地方理解起来还真有点难，不过它的代码看起来却很舒服，简洁美观，似乎很多语法都是为了美观，当然满篇的end除外。<BR><BR>Rails同样给我简洁美观的印象，使用简单，没有什么废话，视图如果不修改的话，甚至可以不生成出来。<BR><BR>不知道效率如何，不过听说Ruby比Python运行效率要高，豆瓣使用Python能做出来，我想使用Ruby应该也可以做出能够接受的东西。<BR><BR>有空要好好学一下Ruby，为了Rails。<BR><BR>4、asgard<BR><BR>最近实在是太忙了，asgard项目起了个头又懒得动了，许多情况下使用C++都意味着要写很多代码，目前完成了异步回调函数的泛类型匹配，在编写调用函数的适配器时，虽然已经想出了解法，只是要写大量的模板，天天在模板堆里头都是痛的，只好先放一放了。<BR><BR><BR>注：<BR>1、上面提到的“异步回调函数的泛类型匹配”，指的是下面的做法：<BR>void callback (int, short, const char*);<BR>Method &lt;string(in&lt;char&gt;, in&lt;char&gt;)&gt; method;<BR>method.async_call ('a', 'b', callback);<BR>由于char可以转型到int, short，而out&lt;string&gt;可以转型到const char*，所以让它支持这种“泛”类型匹配也是理所当然的了，这个东西已经完成了。<BR><BR>2、“调用函数的适配器”是更复杂的一个东西，用在服务器端：<BR>Method &lt;void(inout&lt;Buffer&lt;char&gt; &gt;, in&lt;string&gt;)&gt; my_strcat;<BR>my_strcat.setMethod (Adapter &lt;void(Default&lt;1&gt;, Default&lt;2&gt;, ContainerSize&lt;1&gt;)&gt; (strncat) );<BR><BR>这是最终简化了的形式，比上次所说的简单了不少，因为很多东西是可以推导出来的，这也是测试证明可以实现的，一个简单的修改就是把Adapter从类改为一个函数，由于模板函数的参数类型可以推导出来，所以省去了strncat函数类型的描述。<BR><BR>实际上是把char* strncat(char*, const char*, size_t)匹配给上面这个method，Adapter承担解释角色。<BR><BR>它的函数类型的模板参数中，void可以推导为out&lt;void&gt;，strcat的调用结果赋给out&lt;void&gt;，可以不理会，实际上是使用偏特化来忽略它的，因为我的vector &lt;IParameter*&gt;中根本不包括out&lt;void&gt;这个对象。<BR><BR>后面的Default&lt;1&gt;表示使用默认的转换器，即直接把Buffer&lt;char&gt;对象转成char*类型，由于Buffer&lt;T&gt;中实现了operator T*，这个转换不成问题，下一个是Default&lt;2&gt;，在in&lt;string&gt;中也实现了operator const char*，所以这个转换也很顺利，再下一个是ContainerSize&lt;1&gt;表示从Buffer&lt;char&gt;对象中取容器的大小，这也是个模板。<BR><BR>目前一共实现了3个模板，Default&lt;int&gt;默认转换，Size&lt;int&gt;取sizeof，ContainerSize取容器大小。<BR><BR>写模板既有挑战，又有困难，有时甚至有放弃的想法，甚至有朋友笑话说，人家都动态语言了，你还在使用这种宏一样的语言。我也只好一笑置之，这样的功能在动态语言里多么容易呀，的确在做一种不不明智的事。。。<img src ="http://www.cppblog.com/cpunion/aggbug/595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-10-08 23:15 <a href="http://www.cppblog.com/cpunion/archive/2005/10/08/595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近要学习的东西。</title><link>http://www.cppblog.com/cpunion/archive/2005/09/14/259.html</link><dc:creator>qiezi</dc:creator><author>qiezi</author><pubDate>Wed, 14 Sep 2005 03:24:00 GMT</pubDate><guid>http://www.cppblog.com/cpunion/archive/2005/09/14/259.html</guid><wfw:comment>http://www.cppblog.com/cpunion/comments/259.html</wfw:comment><comments>http://www.cppblog.com/cpunion/archive/2005/09/14/259.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cpunion/comments/commentRss/259.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cpunion/services/trackbacks/259.html</trackback:ping><description><![CDATA[<P>1、动态语言。<BR>C/C++这类静得可怕的语言，很多方面通常会搭配一个动态一点东西。比如python（已经在项目中使用），ruby（还没学习），lua（看样子不错）。<BR>以下是<A href="mailto:cpp@codingnow.com">cpp@codingnow.com</A>中的一点评论：<BR><U>我一直坚信未来会出现高低搭配的局面，像Java/C#这样的半动不静的中级语言会逐渐“沦为”JVM和CLR上的系统语言，应用开发的任务必将由更加动态的脚本语言承担。目前的Python, Ruby和Lua都有可能。如果从我的角度讲，我希望最后胜出的是Lua，因为Python思维有些混乱，Ruby虽然很纯，但是语言设计过于复杂，只有Lua是符合我的美学观——简单而又强大，这一点跟云风意见一致。<BR></U>我自己只使用过python，确实可以作为静态语言的补充。</P>
<P>2、要深入学习antlr。<BR>很多时候，编程语言不是领域描述的最佳语言，需要找一个或编写一个转换工具。<BR>antlr可以帮我们实现一个自己语言的词法分析程序，而不需要忍受yacc生成的天书代码。</P>
<P>3、lua和boost::python。<BR>大致看了一下它们包装C＋＋类的方式，有点相似。<BR>我打算做一个C＋＋语言的轻量级分布式包装库，有些地方可以参考。</P>
<P>4、prolog。<BR>满好玩的东西。</P><img src ="http://www.cppblog.com/cpunion/aggbug/259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cpunion/" target="_blank">qiezi</a> 2005-09-14 11:24 <a href="http://www.cppblog.com/cpunion/archive/2005/09/14/259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>