﻿<?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++博客-flysnowxg</title><link>http://www.cppblog.com/flysnowxg/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 11:18:08 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 11:18:08 GMT</pubDate><ttl>60</ttl><item><title>使用元编程在编译期对数值进行排序</title><link>http://www.cppblog.com/flysnowxg/archive/2014/07/06/207544.html</link><dc:creator>flysnowxg</dc:creator><author>flysnowxg</author><pubDate>Sun, 06 Jul 2014 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/flysnowxg/archive/2014/07/06/207544.html</guid><wfw:comment>http://www.cppblog.com/flysnowxg/comments/207544.html</wfw:comment><comments>http://www.cppblog.com/flysnowxg/archive/2014/07/06/207544.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/flysnowxg/comments/commentRss/207544.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flysnowxg/services/trackbacks/207544.html</trackback:ping><description><![CDATA[<div><div style="color: #000000; font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 13.592233657836914px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20.388349533081055px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">作者：flysnwoxg</div><span style="color: #000000; font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 13.592233657836914px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20.388349533081055px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">c++编译器模板解析确实很强大。基本上可以把编译器看做是一个虚拟机，c++模板源代码就是被执行的脚本代码。</span><div style="color: #000000; font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 13.592233657836914px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20.388349533081055px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">基本上你可以在编译期实现任何算法。<br /><div>下面是一个按照从小到大，然后从大到小对数值对排序的程序，程序使用了冒泡排序，排序在编译期完成。</div><div>例如程序的原始输入为: (<span style="font-size: 10.5pt; line-height: 1.5;">(5,6),</span><span style="font-size: 10.5pt; line-height: 1.5;">(1,5),</span><span style="font-size: 10.5pt; line-height: 1.5;">(3,4))</span></div><div><div>将被从小到大排序为&nbsp;&nbsp;<span style="font-size: 10.5pt; line-height: 1.5;">(</span><span style="font-size: 10.5pt; line-height: 1.5;">(1,5),</span><span style="font-size: 10.5pt; line-height: 1.5;">(3,4),(5,6))</span></div></div><div><div>然后被从大到小排序为&nbsp;&nbsp;<span style="font-size: 10.5pt; line-height: 1.5;">(</span><span style="font-size: 10.5pt; line-height: 1.5;">(5,6)</span><span style="font-size: 10.5pt; line-height: 1.5;">,</span><span style="font-size: 10.5pt; line-height: 1.5;">(3,4)</span><span style="font-size: 10.5pt; line-height: 1.5;">,</span><span style="font-size: 10.5pt; line-height: 1.5;">(1,5)</span><span style="font-size: 10.5pt; line-height: 1.5;">)<br /><br /><br /></span></div></div><div></div><div><div><div><span style="font-size: 12pt; color: #008000; background-color: #efefef;">//author:flysnowxg&nbsp;</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#include<span style="color: windowtext;">&nbsp;<span style="color: #a31515;">"stdio.h"</span></span></span></div><div><span style="font-size: 12pt; color: #008000; background-color: #efefef;">//用模板表示类型，模板的实例化表示对象（如pait_t&lt;1,2&gt;&nbsp;表示(1,2)这样的两个值的对象）</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&lt;</span>int<span style="color: windowtext;">&nbsp;<span style="color: #010001;">_first</span>,</span>int<span style="color: windowtext;">&nbsp;<span style="color: #010001;">_second</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">pair_t</span>{</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">first</span>=<span style="color: #010001;">_first</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">second</span>=<span style="color: #010001;">_second</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">void</span>&nbsp;<span style="color: #010001;">print</span>(){<span style="color: #010001;">printf</span>(<span style="color: #a31515;">"%d&nbsp;%d"</span>,<span style="color: #010001;">first</span>,<span style="color: #010001;">second</span>);}</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;"><br /></span></div><div><span style="font-size: 12pt; color: #008000; background-color: #efefef;">//计算两个不同的pair_t类型的实例的小于关系</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T1</span>,</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T2</span>&gt;&nbsp;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;&nbsp;<span style="color: #010001;">less_t</span>{</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">first_le</span>=<span style="color: #010001;">T1</span>::<span style="color: #010001;">first</span>&lt;<span style="color: #010001;">T2</span>::<span style="color: #010001;">first</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">first_eq</span>=<span style="color: #010001;">T1</span>::<span style="color: #010001;">first</span>==<span style="color: #010001;">T2</span>::<span style="color: #010001;">first</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">second_le</span>=(<span style="color: #010001;">first_eq</span>&amp;&amp;(<span style="color: #010001;">T1</span>::<span style="color: #010001;">second</span>&lt;<span style="color: #010001;">T2</span>::<span style="color: #010001;">second</span>));</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">result</span>=<span style="color: #010001;">first_le</span>&nbsp;||&nbsp;<span style="color: #010001;">second_le</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;"><br /></span></div><div><span style="font-size: 12pt; color: #008000; background-color: #efefef;">//计算两个不同的pair_t类型的实例的大于关系</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T1</span>,</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T2</span>&gt;&nbsp;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;&nbsp;<span style="color: #010001;">greate_t</span>{</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">result</span>=!<span style="color: #010001;">less_t</span>&lt;<span style="color: #010001;">T1</span>,<span style="color: #010001;">T2</span>&gt;::<span style="color: #010001;">result</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;"><br /></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">null_t</span>;</span></span></div><div><span style="font-size: 12pt; color: #008000; background-color: #efefef;">//类型列表</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T1</span>,</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T2</span>&gt;&nbsp;</span>struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t</span>;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T</span>,<span style="color: #010001;">null_t</span>&gt;{</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">T</span>&nbsp;<span style="color: #010001;">value</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">null_t</span>&nbsp;<span style="color: #010001;">next</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T1</span>,</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T2</span>,</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T3</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T1</span>,<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T2</span>,<span style="color: #010001;">T3</span>&gt;&nbsp;&gt;</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">{</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">T1</span>&nbsp;<span style="color: #010001;">value</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T2</span>,<span style="color: #010001;">T3</span>&gt;&nbsp;<span style="color: #010001;">next</span>;&nbsp;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t1</span>(<span style="color: #010001;">e1</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">null_t</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t2</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t1</span>(<span style="color: #010001;">e2</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t3</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t2</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t4</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t3</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t5</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t4</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t6</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t5</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t7</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t6</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t8</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>,<span style="color: #010001;">e8</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t7</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>,<span style="color: #010001;">e8</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t9</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>,<span style="color: #010001;">e8</span>,<span style="color: #010001;">e9</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t8</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>,<span style="color: #010001;">e8</span>,<span style="color: #010001;">e9</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">#define<span style="color: windowtext;">&nbsp;<span style="color: #010001;">list_t10</span>(<span style="color: #010001;">e1</span>,<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>,<span style="color: #010001;">e8</span>,<span style="color: #010001;">e9</span>,<span style="color: #010001;">e10</span>)&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">e1</span>,<span style="color: #010001;">list_t9</span>(<span style="color: #010001;">e2</span>,<span style="color: #010001;">e3</span>,<span style="color: #010001;">e4</span>,<span style="color: #010001;">e5</span>,<span style="color: #010001;">e6</span>,<span style="color: #010001;">e7</span>,<span style="color: #010001;">e8</span>,<span style="color: #010001;">e9</span>,<span style="color: #010001;">e10</span>)&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;"><span style="color: windowtext;"><br /></span></span></div><div><span style="font-size: 12pt; color: #008000; background-color: #efefef;">//递归打印类型列表中每个类型的值</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T</span>&gt;&nbsp;</span>struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">print_t</span>;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">print_t</span>&lt;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T</span>,<span style="color: #010001;">null_t</span>&gt;&gt;</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">{</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">T</span>&nbsp;<span style="color: #010001;">result</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">void</span>&nbsp;<span style="color: #010001;">print</span>(){</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">printf</span>(<span style="color: #a31515;">"\nelem::"</span>);</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">result</span>::<span style="color: #010001;">print</span>();</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T1</span>,</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T2</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">print_t</span>&lt;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T1</span>,<span style="color: #010001;">T2</span>&gt;&gt;</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">{</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">T1</span>&nbsp;<span style="color: #010001;">result</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">void</span>&nbsp;<span style="color: #010001;">print</span>(){</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">printf</span>(<span style="color: #a31515;">"\nelem::"</span>);</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">result</span>::<span style="color: #010001;">print</span>();</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">print_t</span>&lt;<span style="color: #010001;">T2</span>&gt;::<span style="color: #010001;">print</span>();</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;"><br /></span></div><div><span style="font-size: 12pt; color: #008000; background-color: #efefef;">//冒泡排序算法</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T</span>,</span>template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">,</span>typename<span style="color: windowtext;">&gt;&nbsp;</span>class<span style="color: windowtext;">&nbsp;<span style="color: #010001;">CompareT</span>&gt;&nbsp;</span>struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">sort_t</span>;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T</span>,</span>template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">,</span>typename<span style="color: windowtext;">&gt;&nbsp;</span>class<span style="color: windowtext;">&nbsp;<span style="color: #010001;">CompareT</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">sort_t</span>&lt;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T</span>,<span style="color: #010001;">null_t</span>&gt;&nbsp;,<span style="color: #010001;">CompareT</span>&gt;{</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T</span>,<span style="color: #010001;">null_t</span>&gt;&nbsp;<span style="color: #010001;">sort_head</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">T</span>&nbsp;<span style="color: #010001;">least_elem</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">null_t</span>&nbsp;<span style="color: #010001;">remainder</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T</span>,<span style="color: #010001;">null_t</span>&gt;&nbsp;<span style="color: #010001;">result</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">template<span style="color: windowtext;">&lt;</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T1</span>,</span>typename<span style="color: windowtext;">&nbsp;<span style="color: #010001;">T2</span>,</span>template<span style="color: windowtext;">&nbsp;&lt;</span>typename<span style="color: windowtext;">,</span>typename<span style="color: windowtext;">&gt;&nbsp;</span>class<span style="color: windowtext;">&nbsp;<span style="color: #010001;">CompareT</span>&gt;</span></span></div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">struct<span style="color: windowtext;">&nbsp;<span style="color: #010001;">sort_t</span>&lt;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T1</span>,<span style="color: #010001;">T2</span>&gt;,<span style="color: #010001;">CompareT</span>&gt;{</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">template</span>&lt;<span style="color: #0000ff;">bool</span>&nbsp;<span style="color: #010001;">_b_swap</span>&gt;&nbsp;<span style="color: #0000ff;">struct</span>&nbsp;<span style="color: #010001;">swap_t</span>{</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T1</span>,<span style="color: #010001;">T2</span>&gt;&nbsp;<span style="color: #010001;">result</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;};</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">template</span>&lt;&gt;&nbsp;<span style="color: #0000ff;">struct</span>&nbsp;<span style="color: #010001;">swap_t</span>&lt;<span style="color: #0000ff;">false</span>&gt;{</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">T2</span>::<span style="color: #010001;">value</span>,<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">T1</span>,<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">T2</span>::<span style="color: #010001;">next</span>&gt;&nbsp;&gt;&nbsp;<span style="color: #010001;">result</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;};</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;<span style="color: #0000ff;">int</span>&nbsp;<span style="color: #010001;">order</span>=!<span style="color: #010001;">CompareT</span>&lt;<span style="color: #010001;">T1</span>,<span style="color: #010001;">T2</span>::<span style="color: #010001;">value</span>&gt;::<span style="color: #010001;">result</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">swap_t</span>&lt;<span style="color: #010001;">order</span>&gt;::<span style="color: #010001;">result</span>&nbsp;<span style="color: #010001;">sort_head</span>;<span style="color: #008000;">//假如CompareT是less_t,将开头两个元素中大的放前面，小的放后面</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">sort_t</span>&lt;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">sort_head</span>::<span style="color: #010001;">next</span>,<span style="color: #010001;">CompareT</span>&gt;::<span style="color: #010001;">least_elem</span>&nbsp;<span style="color: #010001;">least_elem</span>;<span style="color: #008000;">//假如CompareT是less_t,获取列表中最小的元素</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">sort_head</span>::<span style="color: #010001;">value</span>,<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">sort_t</span>&lt;<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">sort_head</span>::<span style="color: #010001;">next</span>,<span style="color: #010001;">CompareT</span>&gt;::<span style="color: #010001;">remainder</span>&gt;&nbsp;<span style="color: #010001;">remainder</span>;<span style="color: #008000;">//去掉末尾那个最小元素</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t</span>&lt;<span style="color: #010001;">least_elem</span>,<span style="color: #0000ff;">typename</span>&nbsp;<span style="color: #010001;">sort_t</span>&lt;<span style="color: #010001;">remainder</span>,<span style="color: #010001;">CompareT</span>&gt;::<span style="color: #010001;">result</span>&gt;&nbsp;<span style="color: #010001;">result</span>;<span style="color: #008000;">//将最小元素和剩余已经排好序的元素链表组成一个新链表</span></span></div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">};</span>&nbsp; <br /></div></div><div></div><div><div><span style="font-size: 12pt; color: #0000ff; background-color: #efefef;">int<span style="color: windowtext;">&nbsp;<span style="color: #010001;">main</span>(</span>int<span style="color: windowtext;">&nbsp;<span style="color: #010001;">argc</span>,&nbsp;</span>char<span style="color: windowtext;">*&nbsp;<span style="color: #010001;">argv</span>[])</span></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">{</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">pair_t</span>&lt;50,6&gt;&nbsp;<span style="color: #010001;">e1_t</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">pair_t</span>&lt;9,10&gt;&nbsp;<span style="color: #010001;">e2_t</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">pair_t</span>&lt;1,2&gt;&nbsp;<span style="color: #010001;">e3_t</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">pair_t</span>&lt;7,8&gt;&nbsp;<span style="color: #010001;">e4_t</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">pair_t</span>&lt;3,4&gt;&nbsp;<span style="color: #010001;">e5_t</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">pair_t</span>&lt;-6,4&gt;&nbsp;<span style="color: #010001;">e6_t</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;"><br /></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">list_t6</span>(<span style="color: #010001;">e1_t</span>,<span style="color: #010001;">e2_t</span>,<span style="color: #010001;">e3_t</span>,<span style="color: #010001;">e4_t</span>,<span style="color: #010001;">e5_t</span>,<span style="color: #010001;">e6_t</span>)&nbsp;<span style="color: #010001;">date_t</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">printf</span>(<span style="color: #a31515;">"原始数据:"</span>);</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">print_t</span>&lt;<span style="color: #010001;">date_t</span>&gt;::<span style="color: #010001;">print</span>();</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;"><br /></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">sort_t</span>&lt;<span style="color: #010001;">date_t</span>,<span style="color: #010001;">less_t</span>&gt;::<span style="color: #010001;">result</span>&nbsp;<span style="color: #010001;">data_ta</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">printf</span>(<span style="color: #a31515;">"\n\n从小到大:"</span>);</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">print_t</span>&lt;<span style="color: #010001;">data_ta</span>&gt;::<span style="color: #010001;">print</span>();</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;"><br /></span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">typedef</span>&nbsp;<span style="color: #010001;">sort_t</span>&lt;<span style="color: #010001;">date_t</span>,<span style="color: #010001;">greate_t</span>&gt;::<span style="color: #010001;">result</span>&nbsp;<span style="color: #010001;">data_tb</span>;</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">printf</span>(<span style="color: #a31515;">"\n\n从大到小:"</span>);</span></div><div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #010001;">print_t</span>&lt;<span style="color: #010001;">data_tb</span>&gt;::<span style="color: #010001;">print</span>();</span></div><span style="font-size: 12pt; color: windowtext; background-color: #efefef;">}&nbsp;</span>&nbsp; <br /></div><div></div><div>最后的输出：</div><div><div>原始数据:</div><div>elem::50 6</div><div>elem::9 10</div><div>elem::1 2</div><div>elem::7 8</div><div>elem::3 4</div><div>elem::-6 4<br /></div><div></div><div>从小到大:</div><div>elem::-6 4</div><div>elem::1 2</div><div>elem::3 4</div><div>elem::7 8</div><div>elem::9 10</div><div>elem::50 6<br /></div><div></div><div>从大到小:</div><div>elem::50 6</div><div>elem::9 10</div><div>elem::7 8</div><div>elem::3 4</div><div>elem::1 2</div><div>elem::-6 4<br /></div></div></div></div><img src ="http://www.cppblog.com/flysnowxg/aggbug/207544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flysnowxg/" target="_blank">flysnowxg</a> 2014-07-06 16:47 <a href="http://www.cppblog.com/flysnowxg/archive/2014/07/06/207544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tinyscheme完全注释</title><link>http://www.cppblog.com/flysnowxg/archive/2013/11/28/204507.html</link><dc:creator>flysnowxg</dc:creator><author>flysnowxg</author><pubDate>Thu, 28 Nov 2013 09:55:00 GMT</pubDate><guid>http://www.cppblog.com/flysnowxg/archive/2013/11/28/204507.html</guid><wfw:comment>http://www.cppblog.com/flysnowxg/comments/204507.html</wfw:comment><comments>http://www.cppblog.com/flysnowxg/archive/2013/11/28/204507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flysnowxg/comments/commentRss/204507.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flysnowxg/services/trackbacks/204507.html</trackback:ping><description><![CDATA[<font color="#000000" face="Verdana">lisp是一种神奇的语言，scheme是lisp的一种方言。<br />tinyscheme是一个scheme语言的解释器实现，而这是我大幅修改并加了注释后的tinyscheme（基于tinyscheme1.41）<br />代码地址：http://flysnowxg.googlecode.com/svn/tinyscheme_note<br />原始代码： http://tinyscheme.sourceforge.net/home.html<br />tinyscheme据说是实现的r5rs标准（应当是实现了一部分，因为模式匹配和语法定义的那部分显然没实现）<br />tinyscheme代码很简短而且实现的语言功能还算比较完整，如果想研究一个lisp解释器的实现，tinyscheme是值得研究的<br />tinyscheme实现了lambda、宏、延续、异常、gc这些重要的语言机制，还实现了许多库函数，整个原版代码大约有6500行左右，但是原版代码有很多的宏定义和很多冗余的代码，代码分类也很混乱，可读性不算特别好，在阅读过程中我对这个代码进行了大量的修改，清除了大量冗余代码，重新组织了代码结构，主要的实现文件scheme.c被我从5000行改到只有3400行。所有代码加起来也只有4500行了，功能损失也不太多<br />修改一些bug，比如像&#8216;延续&#8217;的实现，原版像下面这样的代码中， &#8220;(r 1)&#8221;这一句是没法运行的<br />(define r 0)<br />(let ((x 1))<br />&nbsp;(set! x <br />&nbsp;&nbsp;(+ x<br />&nbsp;&nbsp;&nbsp;(call/cc (lambda (c) (set! r c) (+ 44 (c 1)))))<br />&nbsp;)<br />&nbsp;(display x))<br />(r 1)<br /><br />有兴趣的可以看一看！</font> <img src ="http://www.cppblog.com/flysnowxg/aggbug/204507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flysnowxg/" target="_blank">flysnowxg</a> 2013-11-28 17:55 <a href="http://www.cppblog.com/flysnowxg/archive/2013/11/28/204507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己动手写脚本语言</title><link>http://www.cppblog.com/flysnowxg/archive/2013/09/02/202952.html</link><dc:creator>flysnowxg</dc:creator><author>flysnowxg</author><pubDate>Mon, 02 Sep 2013 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/flysnowxg/archive/2013/09/02/202952.html</guid><wfw:comment>http://www.cppblog.com/flysnowxg/comments/202952.html</wfw:comment><comments>http://www.cppblog.com/flysnowxg/archive/2013/09/02/202952.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/flysnowxg/comments/commentRss/202952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flysnowxg/services/trackbacks/202952.html</trackback:ping><description><![CDATA[<p>这是我用c++写的一个简单的脚本语言，非常简短，不到3000行代码<br /><!--StartFragment -->
</p>
<div>代码地址：<a href="http://sil-language.googlecode.com">http://sil-language.googlecode.com</a></div>
<p><br />sil语言（simple interpretative lanuage）是一个简单的脚本语言，只是一个玩具，目的是演示用简短的代码去创建一个可用的脚本语言<br />这样一个玩具会是怎么样的呢？<br />sil的设计目标：<br />1 . 非常容易将sil解释器嵌入到c++代码中<br />2 . 非常容易用c++代码来扩展sil的函数调用，使得c++和sil脚本非常容易交互<br />3 . 成为一个有简洁语法的动态语言，有容易使用的语法<br />4 . 拥有一个语言一般都应当拥有的语法</p>
<p>sil语法的完整定义可参考《sil语法说明》。<br />sil语言是动态类型的，编译时不会检查函数的参数个数，参数类型是否合适，甚至不会检查函数定义是否存在，只有到了运行时才会查找函数，检查参数个数是否匹配。<br />对于内置函数还会检查参数类型是否匹配，如果不匹配会试着进行参数类型转换<br />对于用户定义函数，不会进行参数类型匹配的检查<br />第一节 语法：<br />1. 类型：<br />&nbsp;sil暂时支持整形，浮点型，字符串三种数据类型，暂时不支持数组，也不支持自定义类型（这两点是比较严重的缺点）<br />&nbsp;sil是弱类型的，变量不会和类型绑定<br />&nbsp;变量定义像是这样的：<br />&nbsp;var vi=1; //定义一个值为整数1的变量vi<br />&nbsp;var vf=1.0;//定义一个值为浮点数1.0的变量vf<br />&nbsp;var vs="1.0";//定义一个值为字符串"1.0"的字符串vs<br />&nbsp;<br />2. 函数<br />&nbsp;sil是弱类型的，所以定义函数时不需要声明形参的类型，支持return语句<br />&nbsp;函数像这样定义: <br />&nbsp;function myfun(str)<br />&nbsp;{<br />&nbsp;&nbsp;print(str);<br />&nbsp;&nbsp;return 0;<br />&nbsp;&nbsp;print("after return\n");<br />&nbsp;}<br />&nbsp;函数像这样调用：myfun("hello sil");<br />&nbsp;<br />3. 分支<br />&nbsp;sil支持if else 语句,<br />&nbsp;像这样：<br />&nbsp;var i=read(); <br />&nbsp;if(i==1) print("a");<br />&nbsp;else if(i==2) <br />&nbsp;{<br />&nbsp;&nbsp;print("b");<br />&nbsp;}<br />&nbsp;else print("c");<br />&nbsp;<br />4. 循环<br />&nbsp;sil支持while和for循环，支持continue，break语句<br />&nbsp;while像这样：<br />&nbsp;var i=1;<br />&nbsp;while(true)<br />&nbsp;{<br />&nbsp;&nbsp;print("hello sil\n");<br />&nbsp;&nbsp;i=i+1;<br />&nbsp;&nbsp;if(i&gt;5) break;<br />&nbsp;&nbsp;if(i&lt;3) continue;<br />&nbsp;&nbsp;print("after continue\n");<br />&nbsp;}<br />&nbsp;for循环像这样<br />&nbsp;for(var i=0;i&lt;5;i=i+1) print(i+"\n");</p>
<p>5. 基本运算符<br />&nbsp;比较运算支持 == != &gt; &lt;<br />&nbsp;算术运算支持 + - * / % ，还支持一元 -<br />&nbsp;逻辑运算支持 !&nbsp; &amp;&amp; ||<br />&nbsp;支持括号 ( ) 改变求值顺序<br />&nbsp;算符优先级和c中一样<br />&nbsp;<br />5. 内置函数<br />&nbsp;sil类内置函数是非常少的，详见函数说明，以下列出两个比较重要的。<br />&nbsp;eval 可对一个字符串形式的sil代码求值<br />&nbsp;例如 eval("for(var i=0;i&lt;5;i=i+1)print(i);");<br />&nbsp;load 可以加载一个sil代码文件，代码文件中亦可递归调用load函数<br />&nbsp;<br />6. c++嵌入和扩展<br />&nbsp;寥寥数行代码即可将sil嵌入到c++中<br />&nbsp;一个c函数只要形参和返回值类型是int float string，简单调用一个register_function即可将函数注册到sil中，脚本即可方便的调用这些扩展函数<br />&nbsp;extern工程中的代码示例了如何对sil提供文件读写函数的支持<br />&nbsp;<br />第二节 源代码<br />&nbsp;这是一个用vs2008创建的工程，由于使用了shared_ptr，如果给vs2005引入shared_ptr的支持亦可在vs2005下编译通过<br />&nbsp;src目录下是sil语言用c++实现的内核<br />&nbsp;consle目录下是sil语言的命令行解释器<br />&nbsp;extern目录下是一个例子，演示了如何扩展sil的内置函数<br />&nbsp;lib目录下是用sil写的库代码和一些测试代码，但是现在只有简单的测试代码（里面有一个开平方根和求圆周率的有意思的例子）<br />&nbsp;doc目录下是文档<br />&nbsp;bin目录下是可执行文件<br />&nbsp;<br />第三节 函数说明<br />&nbsp;to_int 将一个值转换为int类型，例如：to_int("123");<br />&nbsp;to_float 将一个值转换为float类型，例如：to_float(2);<br />&nbsp;to_string 将一个值转换为string类型，例如：to_string(254);<br />&nbsp;strlen 求字符串的长度，例如：strlen("hello");<br />&nbsp;substr 截取字符串的的一部分，例如：substr("hello",1,3);<br />&nbsp;eval 可以求值一个字符串形式的表达式，例如:&nbsp; var code="1+2*3";eval(code);<br />&nbsp;load 可以加载并执行一个sil代码的文件，例如： load("../lib/math_test.sil");<br />&nbsp;exit 终止脚本的执行，例如：print("hello");exit();print("world");<br />&nbsp;print 打印一个值，例如：print("hello world"+3);<br />&nbsp;read 可以从控制台读取一个字符串，例如：var tmp=read();print(tmp);<br />&nbsp;bat 可以执行一个windows命令，例如：bat("dir");<br />&nbsp;list_function 打印已经定义的内置函数和脚本函数，例如：list_funciton();<br />&nbsp;list_asm_code 打印编译出的代码，例如：list_asm_code();<br />&nbsp;set_sil 可以设置解释器的一些开关，例如：set_sil("",0);<br />&nbsp;help 显示帮助信息，例如：help();<br /></p><img src ="http://www.cppblog.com/flysnowxg/aggbug/202952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flysnowxg/" target="_blank">flysnowxg</a> 2013-09-02 15:45 <a href="http://www.cppblog.com/flysnowxg/archive/2013/09/02/202952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows结构化异常（SEH）、以及vc对结构化异常的封装以及c++异常机制的源代码分析</title><link>http://www.cppblog.com/flysnowxg/archive/2012/05/17/175248.html</link><dc:creator>flysnowxg</dc:creator><author>flysnowxg</author><pubDate>Thu, 17 May 2012 14:25:00 GMT</pubDate><guid>http://www.cppblog.com/flysnowxg/archive/2012/05/17/175248.html</guid><wfw:comment>http://www.cppblog.com/flysnowxg/comments/175248.html</wfw:comment><comments>http://www.cppblog.com/flysnowxg/archive/2012/05/17/175248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flysnowxg/comments/commentRss/175248.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flysnowxg/services/trackbacks/175248.html</trackback:ping><description><![CDATA[什么时候动笔？<img src ="http://www.cppblog.com/flysnowxg/aggbug/175248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flysnowxg/" target="_blank">flysnowxg</a> 2012-05-17 22:25 <a href="http://www.cppblog.com/flysnowxg/archive/2012/05/17/175248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无题</title><link>http://www.cppblog.com/flysnowxg/archive/2012/04/29/173158.html</link><dc:creator>flysnowxg</dc:creator><author>flysnowxg</author><pubDate>Sun, 29 Apr 2012 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/flysnowxg/archive/2012/04/29/173158.html</guid><wfw:comment>http://www.cppblog.com/flysnowxg/comments/173158.html</wfw:comment><comments>http://www.cppblog.com/flysnowxg/archive/2012/04/29/173158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flysnowxg/comments/commentRss/173158.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flysnowxg/services/trackbacks/173158.html</trackback:ping><description><![CDATA[!<img src ="http://www.cppblog.com/flysnowxg/aggbug/173158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flysnowxg/" target="_blank">flysnowxg</a> 2012-04-29 17:32 <a href="http://www.cppblog.com/flysnowxg/archive/2012/04/29/173158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>