<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel rdf:about="https://100poisha.blog.shinobi.jp/RSS/100/">
    <title>100poishaのブログ</title>
    <link>https://100poisha.blog.shinobi.jp/</link>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://100poisha.blog.shinobi.jp/RSS/" />
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
    <description>ゲーム関連の話題に絞っていましたが、全然書かないのでいろいろ解禁してみたり。</description>
    <dc:language>ja</dc:language>
    <dc:date>2010-10-03T20:32:21+09:00</dc:date>
    <items>
    <rdf:Seq>
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F9" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F8" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c--0x/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%81%AA%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E4%BF%9D%E6%8C%81" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c--0x/move-%20move-%20move-" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c-/%E6%B7%BB%E4%BB%98%E3%83%93%E3%83%98%E3%82%A4%E3%83%93%E3%82%A2-attached%20behaviors-" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9/oss%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F7" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F6" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F5" />
      <rdf:li rdf:resource="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F4" />
    </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F9">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F9</link>
    <title>boost::spiritを使ってみた9</title>
    <description>今回は組み込み関数に対応する引数に応じて後々のルールを変更する方法と言うことでひとつ。


#include &amp;amp;lt;iostream&amp;amp;gt;
#include &amp;amp;lt;string&amp;amp;gt;

#pragma warning(push)
#pragma warning(disable:...</description>
    <content:encoded><![CDATA[今回は組み込み関数に対応する引数に応じて後々のルールを変更する方法と言うことでひとつ。<br />
<blockquote>
<div><br />
#include &lt;iostream&gt;<br />
#include &lt;string&gt;<br />
<br />
#pragma warning(push)<br />
#pragma warning(disable:4100) //引数は関数の本体部で 1 度も参照されません。<br />
#pragma warning(disable:4512) //代入演算子を生成できません。<br />
#pragma warning(disable:4819) //ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。<br />
#pragma warning(disable:4127) //条件式が定数です。<br />
<br />
#include &lt;boost/spirit/include/qi_action.hpp&gt;<br />
#include &lt;boost/spirit/include/qi_grammar.hpp&gt;<br />
#include &lt;boost/spirit/include/qi_lexeme.hpp&gt;<br />
#include &lt;boost/spirit/include/qi_operator.hpp&gt;<br />
#include &lt;boost/spirit/include/qi_parse.hpp&gt;<br />
#include &lt;boost/spirit/include/qi_rule.hpp&gt;<br />
<br />
#include &lt;boost/spirit/include/qi_char_.hpp&gt;<br />
#include &lt;boost/spirit/include/qi_string.hpp&gt;<br />
#include &lt;boost/spirit/include/qi_numeric.hpp&gt;<br />
<br />
#include &lt;boost/spirit/include/phoenix_bind.hpp&gt;<br />
#include &lt;boost/spirit/include/phoenix_operator.hpp&gt;<br />
#include &lt;boost/spirit/include/phoenix_statement.hpp&gt;<br />
<br />
#pragma warning(pop)<br />
<br />
#pragma warning(disable:4503) //装飾された名前の長さが限界を越えました。<br />
<br />
template&lt;typename String, typename Skipper&gt;<br />
struct Parser : boost::spirit::qi::grammar&lt;typename String::const_iterator, Skipper&gt;{<br />
&nbsp;&nbsp;&nbsp; typedef typename String::const_iterator Iterator;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, Skipper&gt; func1;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, Skipper&gt; func2;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::symbols&lt;char, boost::spirit::qi::rule&lt;Iterator, Skipper&gt;&gt; funcs;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, Skipper&gt; statement;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, boost::spirit::qi::locals&lt;boost::spirit::qi::rule&lt;Iterator, Skipper&gt;&gt;, Skipper&gt; statement2;<br />
<br />
&nbsp;&nbsp;&nbsp; Parser() : Parser::base_type(statement){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文法定義<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace boost::spirit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace boost::spirit::ascii;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace boost::spirit::labels;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace phoenix = boost::phoenix;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //テストコード<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func1 = '(' &gt;&gt; int_ &gt;&gt; ')';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func2 = '(' &gt;&gt; char_ &gt;&gt; &quot;,&quot; &gt;&gt; char_ &gt;&gt; ')';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; funcs.add<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;func1&quot;, func1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;func2&quot;, func2)<br />
&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; statement2 = (funcs[_a = _1] &gt;&gt; lazy(_a));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement = statement2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
};<br />
<br />
template&lt;typename String&gt;<br />
struct SkipParser : boost::spirit::qi::grammar&lt;typename String::const_iterator&gt;{<br />
&nbsp;&nbsp;&nbsp; typedef typename String::const_iterator Iterator;<br />
<br />
&nbsp;&nbsp;&nbsp; SkipParser() : SkipParser::base_type(comment){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace boost::spirit;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comment&nbsp; = boost::spirit::ascii::space<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (&quot;//&quot; &gt;&gt; *(qi::char_ - '\n') &gt;&gt; '\n')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (&quot;/*&quot; &gt;&gt; *(qi::char_ - &quot;*/&quot;) &gt;&gt; &quot;*/&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator&gt; comment;<br />
};<br />
<br />
int main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp; namespace phoenix = boost::phoenix;<br />
<br />
&nbsp;&nbsp;&nbsp; typedef SkipParser&lt;std::string&gt; SkipperType;<br />
&nbsp;&nbsp;&nbsp; typedef Parser&lt;std::string, SkipperType&gt; ParserType;<br />
&nbsp;&nbsp;&nbsp; SkipperType skipper;<br />
<br />
&nbsp;&nbsp;&nbsp; ParserType parser;<br />
<br />
&nbsp;&nbsp;&nbsp; std::string str;<br />
&nbsp;&nbsp;&nbsp; while (getline(std::cin, str))<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (str.empty() || str[0] == 'q' || str[0] == 'Q')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string::const_iterator it = str.begin();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string::const_iterator end = str.end();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool result = phrase_parse(it, end, parser, skipper);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result &amp;&amp; it == end)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Parsing succeeded\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; str &lt;&lt; &quot; Parses OK: &quot; &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(result)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Parsing succeeded\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; std::string(str.begin(), it) &lt;&lt; &quot; Parses OK: &quot; &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; std::string(it, end) &lt;&lt; &quot; amari&quot; &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Parsing failed\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}</div>
</blockquote><br />
symbolsさんを使います。<br />
<blockquote>
<div>boost::spirit::qi::symbols&lt;char, boost::spirit::qi::rule&lt;Iterator, Skipper&gt;&gt; funcs;</div>
</blockquote>コレは、前者の値に対応して後者を返すルールを簡単に作れるもの&hellip;&hellip;です。多分。<br />
今回は関数名と対応するルールで作りましたが、もっとわかりやすい例としては<br />
<blockquote>
<div>boost::spirit::qi::symbols&lt;char, int&gt; nums;<br />
<br />
nums.add<br />
&nbsp;&nbsp;&nbsp; (&quot;one&quot;, 1)<br />
&nbsp;&nbsp;&nbsp; (&quot;two&quot;, 2)<br />
&nbsp;&nbsp;&nbsp; (&quot;three&quot;, 3)<br />
&nbsp;&nbsp;&nbsp; ;</div>
</blockquote><br />
とかして英語と数字のマッピングなんかも出来ちゃいます。多分。<br />
<br />
あと、この部分<br />
<blockquote>
<div>func1 = '(' &gt;&gt; int_ &gt;&gt; ')';<br />
func2 = '(' &gt;&gt; char_ &gt;&gt; &quot;,&quot; &gt;&gt; char_ &gt;&gt; ')';<br />
funcs.add<br />
&nbsp;&nbsp;&nbsp; (&quot;func1&quot;, func1)<br />
&nbsp;&nbsp;&nbsp; (&quot;func2&quot;, func2)<br />
&nbsp;&nbsp;&nbsp; ;<br />
statement2 = (funcs[_a = _1] &gt;&gt; lazy(_a));<br />
statement = statement2;</div>
</blockquote>を、こんな感じ<br />
<blockquote>
<div>statement = statement2;<br />
statement2 = (funcs[_a = _1] &gt;&gt; lazy(_a));<br />
funcs.add<br />
&nbsp;&nbsp;&nbsp; (&quot;func1&quot;, func1)<br />
&nbsp;&nbsp;&nbsp; (&quot;func2&quot;, func2)<br />
&nbsp;&nbsp;&nbsp; ;<br />
<br />
func1 = '(' &gt;&gt; int_ &gt;&gt; ')';<br />
func2 = '(' &gt;&gt; char_ &gt;&gt; &quot;,&quot; &gt;&gt; char_ &gt;&gt; ')';</div>
</blockquote><br />
にすると、うまく動きません。実行時エラー起こします。<br />
設定の順番が大事みたいです。<br />
<br />
さらに、この部分<br />
<blockquote>
<div>statement2 = (funcs[_a = _1] &gt;&gt; lazy(_a));<br />
statement = statement2;</div>
</blockquote><br />
を、こんな感じ<br />
<blockquote>
<div>statement = (funcs[_a = _1] &gt;&gt; lazy(_a));</div>
</blockquote><br />
にしたい場合、<br />
<blockquote>
<div>struct Parser : boost::spirit::qi::grammar&lt;typename String::const_iterator, boost::spirit::qi::locals&lt;boost::spirit::qi::rule&lt;typename String::const_iterator, Skipper&gt;&gt;, Skipper&gt;{<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;中略&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, boost::spirit::qi::locals&lt;boost::spirit::qi::rule&lt;Iterator, Skipper&gt;&gt;, Skipper&gt; statement;</div>
</blockquote><br />
ってしないとダメみたいです。<br />
<br />
とりあえず今日はこんなところで。<br />]]></content:encoded>
    <dc:subject>プログラム:boost</dc:subject>
    <dc:date>2010-10-03T20:32:25+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F8">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F8</link>
    <title>boost::spiritを使ってみた8</title>
    <description>今回は、定義されていない変数があった場合、セマンティックアクションから構文解析を失敗させる方法です。

なお、以下のコードはboostの1.44.0とVC++2010 Expressで動作確認しています。

#include &amp;amp;lt;iostream&amp;amp;gt;
#include &amp;amp;lt;st...</description>
    <content:encoded><![CDATA[今回は、定義されていない変数があった場合、セマンティックアクションから構文解析を失敗させる方法です。<br />
<br />
なお、以下のコードはboostの1.44.0とVC++2010 Expressで動作確認しています。<br />
<blockquote>
<div>#include &lt;iostream&gt;<br />
#include &lt;string&gt;<br />
#include &lt;map&gt;<br />
<br />
#pragma warning(push)<br />
#pragma warning(disable:4100) //引数は関数の本体部で 1 度も参照されません。<br />
#pragma warning(disable:4512) //代入演算子を生成できません。<br />
#pragma warning(disable:4819) //ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。<br />
#pragma warning(disable:4127) //条件式が定数です。<br />
<br />
#include &lt;boost/spirit/include/qi.hpp&gt;<br />
#include &lt;boost/spirit/include/phoenix.hpp&gt;<br />
#include &lt;boost/foreach.hpp&gt;<br />
<br />
#pragma warning(pop)<br />
<br />
#pragma warning(disable:4503) //装飾された名前の長さが限界を越えました。<br />
<br />
template&lt;typename String, typename Skipper&gt;<br />
struct Parser : boost::spirit::qi::grammar&lt;typename String::const_iterator, Skipper&gt;{<br />
&nbsp;&nbsp;&nbsp; typedef typename String::const_iterator Iterator;<br />
<br />
&nbsp;&nbsp;&nbsp; struct Callback{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::function&lt;void (const String&amp;, int)&gt; SetValiable;&nbsp;&nbsp;&nbsp; //変数名と値を渡して、変数を保持する関数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::function&lt;int (const String&amp;)&gt; GetValiable;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //変数名を渡して、変数を返す関数<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Callback(boost::function&lt;void (const String&amp;, int)&gt; SetValiable,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::function&lt;int (const String&amp;)&gt; GetValiable) :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetValiable(SetValiable),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetValiable(GetValiable){}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Callback(){}<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
&nbsp;&nbsp;&nbsp; Parser(const Callback&amp; callback) : Parser::base_type(line){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //その他初期化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!SetCallback(callback)) throw std::invalid_argument(&quot;callback&quot;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //文法定義<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace boost::spirit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace boost::spirit::ascii;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //expression_group = '(' &gt;&gt; expression[_val = _1] &gt;&gt; ')';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expression_group = '(' &gt;&gt; expression &gt;&gt; ')';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expression_factor = int_&nbsp; //数字<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | expression_group//部分式の演算結果<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | variable_reference;&nbsp;&nbsp;&nbsp; //変数<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expression_term&nbsp;&nbsp;&nbsp; = expression_factor[_val = _1] &gt;&gt; *(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ('*' &gt;&gt; expression_factor[_val *= _1])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ('/' &gt;&gt; expression_factor[_val /= _1])<br />
&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; expression&nbsp;&nbsp;&nbsp; = expression_term[_val = _1] &gt;&gt; *(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ('+' &gt;&gt; expression_term[_val += _1])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ('-' &gt;&gt; expression_term[_val -= _1])<br />
&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; //変数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; variable = lexeme[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //alpha[_val += _1] &gt;&gt; +alnum[_val += _1]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha &gt;&gt; +alnum<br />
&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; variable_reference&nbsp;&nbsp;&nbsp; = variable[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::phoenix::try_[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _val = boost::phoenix::bind(&amp;Parser::GetVariableValue, this, _1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ].catch_all[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pass = false<br />
&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; variable_assignment&nbsp;&nbsp;&nbsp; = ( variable &gt;&gt; &quot;=&quot; &gt;&gt; expression )[boost::phoenix::bind(&amp;Parser::SetVariableValue, this, _1, _2)];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line = variable_assignment;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
private:<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, int(), Skipper&gt; expression;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, int(), Skipper&gt; expression_term;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, int(), Skipper&gt; expression_factor;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, int(), Skipper&gt; expression_group;<br />
<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, String(), Skipper&gt; variable;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, int(), Skipper&gt; variable_reference;<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, Skipper&gt; variable_assignment;<br />
<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator, Skipper&gt; line;<br />
<br />
&nbsp;&nbsp;&nbsp; bool SetCallback(const Callback&amp; callback){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(callback.SetValiable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; callback.GetValiable){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;callback = callback;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; int GetVariableValue(String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return callback.GetValiable(name);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; void SetVariableValue(String name, int i){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback.SetValiable(name, i);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; void CallFunction(String name, String arg){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback.CallFunction(name, arg);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; Callback callback;<br />
};<br />
<br />
template&lt;typename String&gt;<br />
struct SkipParser : boost::spirit::qi::grammar&lt;typename String::const_iterator&gt;{<br />
&nbsp;&nbsp;&nbsp; typedef typename String::const_iterator Iterator;<br />
<br />
&nbsp;&nbsp;&nbsp; SkipParser() : SkipParser::base_type(comment){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace boost::spirit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //using namespace boost::spirit::arg_names;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comment&nbsp; = boost::spirit::ascii::space<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (&quot;//&quot; &gt;&gt; *(qi::char_ - '\n') &gt;&gt; '\n')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (&quot;/*&quot; &gt;&gt; *(qi::char_ - &quot;*/&quot;) &gt;&gt; &quot;*/&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; boost::spirit::qi::rule&lt;Iterator&gt; comment;<br />
};<br />
<br />
class VariableManager{<br />
public:<br />
&nbsp;&nbsp;&nbsp; void Set(std::string name, int value){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; container[name] = value;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; int Get(std::string name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto it = container.find(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(it == container.end())&nbsp;&nbsp;&nbsp; throw std::exception();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return it-&gt;second;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; void View(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOST_FOREACH(auto pair, container){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; pair.first &lt;&lt; &quot;:&quot; &lt;&lt; pair.second &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
private:<br />
&nbsp;&nbsp;&nbsp; typedef std::map&lt;std::string, int&gt; Container;<br />
&nbsp;&nbsp;&nbsp; Container container;<br />
};<br />
<br />
int main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp; namespace phoenix = boost::phoenix;<br />
<br />
&nbsp;&nbsp;&nbsp; typedef SkipParser&lt;std::string&gt; SkipperType;<br />
&nbsp;&nbsp;&nbsp; typedef Parser&lt;std::string, SkipperType&gt; ParserType;<br />
&nbsp;&nbsp;&nbsp; SkipperType skipper;<br />
<br />
&nbsp;&nbsp;&nbsp; VariableManager vm;<br />
<br />
&nbsp;&nbsp;&nbsp; ParserType::Callback callback(phoenix::bind(&amp;VariableManager::Set, &amp;vm, phoenix::arg_names::arg1, phoenix::arg_names::arg2),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phoenix::bind(&amp;VariableManager::Get, &amp;vm, phoenix::arg_names::arg1));<br />
<br />
&nbsp;&nbsp;&nbsp; ParserType parser(callback);<br />
<br />
&nbsp;&nbsp;&nbsp; std::string str;<br />
&nbsp;&nbsp;&nbsp; while (getline(std::cin, str))<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (str.empty() || str[0] == 'q' || str[0] == 'Q')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string::const_iterator it = str.begin();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string::const_iterator end = str.end();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool result = phrase_parse(it, end, parser, skipper);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result &amp;&amp; it == end)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Parsing succeeded\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; str &lt;&lt; &quot; Parses OK: &quot; &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vm.View();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(result)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Parsing succeeded\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; std::string(str.begin(), it) &lt;&lt; &quot; Parses OK: &quot; &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; std::string(it, end) &lt;&lt; &quot; amari&quot; &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vm.View();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Parsing failed\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;-------------------------\n&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vm.View();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}</div>
</blockquote>前のコードから変数管理部分を外だしにしたり、ちょっとずつ違いますけど&hellip;&hellip;<br />
<br />
ポイントはここ。<blockquote>
<div>variable_reference&nbsp;&nbsp;&nbsp; = variable[<br />
boost::phoenix::try_[<br />
&nbsp;&nbsp;&nbsp; _val = boost::phoenix::bind(&amp;Parser::GetVariableValue, this, _1)<br />
].catch_all[<br />
&nbsp;&nbsp;&nbsp; _pass = false<br />
]];</div>
</blockquote>こっそりphoenixの例外処理とか使ってますが。<br />
_pass(boost::sprit::_pass)にfalseを代入すると構文解析に失敗してくれます。<br />
ただし、バックトラックとかしてくれる関係で、変数が一つも存在しないときに<br />
hoge = 3 + fuga<br />
を解析するとhoge = 3までは解析成功してしまいます。<br />
<br />
後、本筋とは関係ないのですけど、以前まで<blockquote>
<div>//expression_group = '(' &gt;&gt; expression[_val = _1] &gt;&gt; ')';</div>
</blockquote>とかしていた部分は単純に<blockquote>
<div>expression_group = '(' &gt;&gt; expression &gt;&gt; ')';</div>
</blockquote>でよきに計らってくれるみたいです。<br />
<br />]]></content:encoded>
    <dc:subject>プログラム:boost</dc:subject>
    <dc:date>2010-09-05T16:35:06+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c--0x/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%81%AA%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E4%BF%9D%E6%8C%81">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c--0x/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%81%AA%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E4%BF%9D%E6%8C%81</link>
    <title>スマートポインタでスマートなハンドル保持</title>
    <description>スマートポインタはいろいろと便利ですが、そのままでは各種ハンドルの保持が出来ません。
大体ハンドルは何かのポインタなので、shared_ptr&amp;amp;lt;void&amp;amp;gt;で保持するのも一つの手ですが、
unique_ptrで十分な箇所ではなんだかもったいない感じです。

かといって、unique...</description>
    <content:encoded><![CDATA[スマートポインタはいろいろと便利ですが、そのままでは各種ハンドルの保持が出来ません。<br />
大体ハンドルは何かのポインタなので、shared_ptr&lt;void&gt;で保持するのも一つの手ですが、<br />
unique_ptrで十分な箇所ではなんだかもったいない感じです。<br />
<br />
かといって、unique_ptrだと関数オブジェクトを作ったりテンプレート引数にいろいろ渡したり不便です。<br />
なので、簡単に利用できるようにテンプレート化してみました。<br />
多分問題なく使用出来るはず&hellip;&hellip;です。<br />
無保証って事で一つ。<br />
適当にコピーとかして使ってください。<blockquote>
<div><br />
#include&lt;functional&gt;<br />
#include&lt;memory&gt;<br />
#include&lt;iostream&gt;<br />
<br />
template&lt;typename T&gt;<br />
struct Deleter{<br />
&nbsp;&nbsp;&nbsp; typedef T pointer;<br />
&nbsp;&nbsp;&nbsp; typedef std::function&lt;void(T)&gt; DeleteFunction;<br />
<br />
&nbsp;&nbsp;&nbsp; DeleteFunction df;<br />
<br />
&nbsp;&nbsp;&nbsp; void operator()(T rc){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; df(rc);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; Deleter(DeleteFunction df){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this-&gt;df = df;<br />
&nbsp;&nbsp;&nbsp; }<br />
};<br />
<br />
template&lt;typename T&gt;<br />
std::unique_ptr&lt;T, Deleter&lt;T&gt;&gt; CreateUniquePtr(T t, typename Deleter&lt;T&gt;::DeleteFunction df){<br />
&nbsp;&nbsp;&nbsp; return std::unique_ptr&lt;T, Deleter&lt;T&gt;&gt;(t, Deleter&lt;T&gt;(df));<br />
}<br />
<br />
int main(){<br />
&nbsp;&nbsp;&nbsp; int i = 42;<br />
<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; auto intHolder = CreateUniquePtr(i, [](int i){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout &lt;&lt; i &lt;&lt; std::endl;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; }<br />
}</div>
</blockquote>]]></content:encoded>
    <dc:subject>プログラム:C++0x</dc:subject>
    <dc:date>2010-08-22T03:46:43+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c--0x/move-%20move-%20move-">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c--0x/move-%20move-%20move-</link>
    <title>move! move! move!</title>
    <description>C++0xすごい! Move Semantics最高!ということで個人的なまとめなど。
右辺値参照について詳しく知りたい場合は
http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in...</description>
    <content:encoded><![CDATA[<p>C++0xすごい! Move Semantics最高!ということで個人的なまとめなど。</p>
<p>右辺値参照について詳しく知りたい場合は<br />
<a href="http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx">http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx</a><br />
とか<br />
<a href="http://d.hatena.ne.jp/ntnek/20090210/p1">http://d.hatena.ne.jp/ntnek/20090210/p1</a><br />
とかへどうぞ。</p>
<p>なお、以下のコードは私の理解している物なので間違っているかもです。<br />
VC++2010 Expressで動作確認を行っています。<br />
また、RVOとかNRVOとかは無視しているので最適化によっては別の動作をする事があります。</p>
<p><br />
こんなクラスを作ってみます。</p>
<blockquote>
<p>using std::string;<br />
<br />
class C<br />
{<br />
public:<br />
&nbsp;explicit C(const string&amp; s) : s(s){}</p>
<p>&nbsp;//copy<br />
&nbsp;C(const C&amp; c) : s(c.s){}</p>
<p>&nbsp;//copy<br />
&nbsp;C&amp; operator=(const C&amp; c){<br />
&nbsp;&nbsp;//copy and swap<br />
&nbsp;&nbsp;C temp(c);</p>
<p>&nbsp;&nbsp;std::swap(*this, temp);</p>
<p>&nbsp;&nbsp;return *this;<br />
&nbsp;}</p>
<p>&nbsp;//move<br />
&nbsp;C(C&amp;&amp; c) : s(std::move(c.s)){}</p>
<p>&nbsp;//move<br />
&nbsp;C&amp; operator=(C&amp;&amp; c){<br />
&nbsp;&nbsp;s = std::move(c.s);</p>
<p>&nbsp;&nbsp;return *this;<br />
&nbsp;}<br />
<br />
//今やthrowしないswapは必要ない</p>
<p>private:<br />
&nbsp;string s;<br />
};</p>
</blockquote>
<p>このクラスにたいして、こんな事が出来ちゃいます。</p>
<blockquote>
<p>C create(const string&amp; s){<br />
&nbsp;return C(s);<br />
}</p>
<p>int main(){<br />
&nbsp;C c1 = create(&quot;c1&quot;);<br />
}</p>
</blockquote>
<p>今までなら例外安全性がどうとか言われる所ですが&hellip;&hellip;<br />
create関数内でCのコンストラクタが呼ばれて、作成されたオブジェクトを返します。<br />
そのときにmoveコンストラクタが呼ばれ、c1が初期化されるので、create関数内でオブジェクトの作成が成功した場合、例外が発生することはありません。<br />
(moveは例外を投げないようにしないといけないため)</p>
<p>また、関数内でインスタンスのコピーが必要な場合、以下のように書くと</p>
<blockquote>
<p>void copy_use(C c){<br />
&nbsp;//処理<br />
}</p>
<p>void use(const C&amp; c){<br />
&nbsp;//処理<br />
}</p>
<p>void out(C&amp; c){<br />
&nbsp;//処理<br />
}</p>
<p>int main(){<br />
&nbsp;C c1(&quot;c1&quot;);<br />
&nbsp;C&amp; c1ref = c1;</p>
<p>&nbsp;copy_use(c1);&nbsp;&nbsp;&nbsp;//1<br />
&nbsp;copy_use(c1ref);&nbsp;&nbsp;//2<br />
&nbsp;copy_use(create(&quot;c2&quot;));&nbsp;//3</p>
<p>&nbsp;use(c1);&nbsp;&nbsp;&nbsp;&nbsp;//4<br />
&nbsp;use(c1ref);&nbsp;&nbsp;&nbsp;&nbsp;//5<br />
&nbsp;use(create(&quot;c2&quot;));&nbsp;&nbsp;//6</p>
<p>&nbsp;out(c1);&nbsp;&nbsp;&nbsp;&nbsp;//7<br />
&nbsp;out(c1ref);&nbsp;&nbsp;&nbsp;&nbsp;//8<br />
&nbsp;//compile error!<br />
&nbsp;//out(create(&quot;c2&quot;));&nbsp;//9<br />
}</p>
</blockquote>
<p>1、2の場合はコピーコンストラクタが呼び出されてコピーが作成されますが、3の場合はmoveコンストラクタが呼ばれて余分なコピーは作成されません。<br />
また、今まで通り引数をただ参照したいだけなら4、5、6が、引数の書き換えも行いたい場合は7、8が使用できます。<br />
残念ながらVC++だと9が「非標準の拡張」としてコンパイルが通っちゃうのですけど。警告レベル4にしないと教えてくれないあたり意地悪です。<br />
<br />
ちなみに、throwしないswapが必要ないのは、std::swapがmoveを使用してくれるので、そもそも例外がでない上に効率が良いからです。</p>
<p>moveコンストラクタとmove代入演算子は、なるべく上記に習って作成した方がいいです。<br />
なぜなら、規格でこの二つの関数が自動生成されるみたいだからです。<br />
<a href="http://d.hatena.ne.jp/faith_and_brave/20100331/1270020213">http://d.hatena.ne.jp/faith_and_brave/20100331/1270020213</a><br />
VC++2010ではまだ実装されていないようですが、将来的に自動生成された物に置き換えられるように&hellip;&hellip;ということです。<br />
後、生ポインタを持っていると、自動生成されるmoveコンストラクタとかmove代入演算子が危ないので、<br />
メンバには生ポインタではなくstd::unique_ptrやstd::shared_ptrに入れた方が良さそうです。標準ですし。<br />
※特にこのあたり、誤解がありそうです。ポインタを持っているクラスなんてたくさんありそうですし、互換性とか大丈夫なのでしょうか&hellip;&hellip;と思うのですけど。まあ、そんなことを行っているプログラムがバグのないまともなプログラムとも思えませんが&hellip;&hellip;</p>
<p>あと、やっぱりVC++2010にはありませんが、こんな物もあるみたいです。<br />
<a href="http://d.hatena.ne.jp/faith_and_brave/20081204/1228382167">http://d.hatena.ne.jp/faith_and_brave/20081204/1228382167</a><br />
具体的にどういう事が出来て何がうれしいのかがよくわからないので、とりあえずメモ書きだけ。<br />
&nbsp;</p>]]></content:encoded>
    <dc:subject>プログラム:C++0x</dc:subject>
    <dc:date>2010-07-03T12:08:03+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c-/%E6%B7%BB%E4%BB%98%E3%83%93%E3%83%98%E3%82%A4%E3%83%93%E3%82%A2-attached%20behaviors-">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-c-/%E6%B7%BB%E4%BB%98%E3%83%93%E3%83%98%E3%82%A4%E3%83%93%E3%82%A2-attached%20behaviors-</link>
    <title>添付ビヘイビア(Attached Behaviors)</title>
    <description>添付ビヘイビア自体については他のサイトにお任せします。
MVVMパターンを使用したときに、イベントとVMのコマンドをBindingしたいときに使えるみたいです。
以下のコードはWPF Model-View-ViewModel Toolkitを使用しています。
まずはXAMLです。

&amp;amp;lt...</description>
    <content:encoded><![CDATA[<p>添付ビヘイビア自体については他のサイトにお任せします。<br />
MVVMパターンを使用したときに、イベントとVMのコマンドをBindingしたいときに使えるみたいです。</p>
<p>以下のコードはWPF Model-View-ViewModel Toolkitを使用しています。</p>
<p>まずはXAMLです。</p>
<blockquote>
<p>&lt;!--前略--&gt;<br />
&lt;Grid&gt;<br />
&nbsp;&lt;ListView Name=&quot;listView&quot; ItemsSource=&quot;{Binding Path=Table}&quot;&gt;<br />
&nbsp;&nbsp;&lt;ListView.View&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;GridView&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;GridViewColumn DisplayMemberBinding=&quot;{Binding Path=Name}&quot; Header=&quot;Name&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;GridViewColumn DisplayMemberBinding=&quot;{Binding Path=Age}&quot; Header=&quot;Age&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/GridView&gt;<br />
&nbsp;&nbsp;&lt;/ListView.View&gt;<br />
&nbsp;&lt;/ListView&gt;<br />
&lt;/Grid&gt;<br />
&lt;!--後略--&gt;</p>
</blockquote>
<p>いろいろは省略しますが、このGridViewの選択行が変わったときにメッセージボックスを出してみようと思います。<br />
ついでにNameの値を拾ってみたりも。</p>
<p>まずはコマンドを用意します。<br />
VMに以下のコードを追加します。</p>
<blockquote>
<p>//前略<br />
private DelegateCommand&lt;string&gt; changeNameCommand;</p>
<p>public ICommand ChangeNameCommand<br />
{<br />
&nbsp;get<br />
&nbsp;{<br />
&nbsp;&nbsp;if (changeNameCommand == null)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;changeNameCommand = new DelegateCommand&lt;string&gt;(ChangeName);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return changeNameCommand;<br />
&nbsp;}<br />
}</p>
<p>private void ChangeName(string s)<br />
{<br />
&nbsp;MessageBox.Show(s);<br />
}<br />
//後略</p>
</blockquote>
<p>普通にコマンドを作成します。</p>
<p>次に添付ビヘイビアを作成します。</p>
<blockquote>
<p>//前略<br />
namespace WpfModelViewTest.Behavior<br />
{<br />
&nbsp;class ListViewBehavior<br />
&nbsp;{<br />
&nbsp;&nbsp;#region SelectionChangedCommand</p>
<p>&nbsp;&nbsp;public static readonly DependencyProperty SelectionChangedCommandProperty =<br />
&nbsp;&nbsp;&nbsp;DependencyProperty.RegisterAttached(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&quot;SelectionChangedCommand&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;typeof(ICommand),<br />
&nbsp;&nbsp;&nbsp;&nbsp;typeof(ListViewBehavior),<br />
&nbsp;&nbsp;&nbsp;&nbsp;new UIPropertyMetadata(null, OnSelectionChangedCommandPropertyChanged));</p>
<p>&nbsp;&nbsp;public static ICommand GetSelectionChangedCommand(DependencyObject obj)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;return (ICommand)obj.GetValue(SelectionChangedCommandProperty);<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public static void SetSelectionChangedCommand(DependencyObject obj, ICommand value)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;obj.SetValue(SelectionChangedCommandProperty, value);<br />
&nbsp;&nbsp;}</p>
</blockquote>
<p>ここまではほぼ定型文です。</p>
<blockquote>
<p>&nbsp;&nbsp;static void OnSelectionChangedCommandPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;ListView listView = obj as ListView;<br />
&nbsp;&nbsp;&nbsp;if (listView == null)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;ICommand command = (ICommand)e.NewValue;<br />
&nbsp;&nbsp;&nbsp;if (command != null)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;listView.SelectionChanged += new SelectionChangedEventHandler(OnSelectionChanged);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;listView.SelectionChanged -= new SelectionChangedEventHandler(OnSelectionChanged);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</p>
</blockquote>
<p>ここで、SelectionChangedイベントが発生したときに関数を実行するようにします。<br />
ListViewのイベントであれば、SelectionChanged以外も使用できます。</p>
<blockquote>
<p>&nbsp;&nbsp;static void OnSelectionChanged(object sender, SelectionChangedEventArgs e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;ListView listView = sender as ListView;<br />
&nbsp;&nbsp;&nbsp;ICommand command = ListViewBehavior.GetSelectionChangedCommand(listView);<br />
&nbsp;&nbsp;&nbsp;if (command != null)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var rowView = listView.SelectedItem as DataRowView;<br />
&nbsp;&nbsp;&nbsp;&nbsp;var row = rowView.Row as NameAgeDataSet.DataTableRow;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (row == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.Execute(&quot;拾えませんでした&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.Execute(row.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;#endregion<br />
&nbsp;}<br />
}</p>
</blockquote>
<p>で、イベントが発生したときにコマンドとNameの値を取得して、コマンドを実行します。</p>
<p>最後に、XAMLを修正します。</p>
<blockquote>
<p>&lt;Window x:Class=&quot;WpfModelViewTest.Views.MainView&quot;<br />
&nbsp;xmlns=&quot;<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>&quot;<br />
&nbsp;xmlns:x=&quot;<a href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>&quot;<br />
&nbsp;xmlns:c=&quot;clr-namespace:WpfModelViewTest.Commands&quot;<br />
&nbsp;xmlns:l=&quot;clr-namespace:WpfModelViewTest.Behavior&quot;<br />
&nbsp;Title=&quot;Main Window&quot; Height=&quot;400&quot; Width=&quot;800&quot;&gt;</p>
</blockquote>
<p>重要なのはxmlns:lの行です。<br />
添付ビヘイビアを作成したNamespaceを指定します。</p>
<blockquote>
<p>&lt;!--中略--&gt;<br />
&lt;Grid&gt;<br />
&nbsp;&lt;ListView l:ListViewBehavior.SelectionChangedCommand=&quot;{Binding Path=ChangeNameCommand}&quot; Name=&quot;listView&quot; ItemsSource=&quot;{Binding Path=Table}&quot;&gt;<br />
&nbsp;&nbsp;&lt;ListView.View&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;GridView&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;GridViewColumn DisplayMemberBinding=&quot;{Binding Path=Name}&quot; Header=&quot;Name&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;GridViewColumn DisplayMemberBinding=&quot;{Binding Path=Age}&quot; Header=&quot;Age&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/GridView&gt;<br />
&nbsp;&nbsp;&lt;/ListView.View&gt;<br />
&nbsp;&lt;/ListView&gt;<br />
&lt;/Grid&gt;<br />
&lt;!--後略--&gt;</p>
</blockquote>
<p>で、添付ビヘイビアにVMのコマンドをBindingします。</p>
<p>以上です。</p>
<p>あまり良くない方法だと思いますが、複数のイベントとコマンドをBindingしてみたサンプルをおいておきます。<br />
<a href="//100poisha.blog.shinobi.jp/File/WpfModelViewTest.zip">http://file.100poisha.blog.shinobi.jp/WpfModelViewTest.zip</a></p>]]></content:encoded>
    <dc:subject>プログラム:C#</dc:subject>
    <dc:date>2010-05-20T22:39:33+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9/oss%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9/oss%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6</link>
    <title>OSSライセンスについて</title>
    <description>オープンソースライセンスというのがよくわからないのでまとめてみました。
突っ込み歓迎です。
ちなみに、以下は私の解釈なので、私以外の人がこれを信用した結果何か損害があっても一切責任を負わないものとします。

とりあえず、公式な参考訳があるMS-PLを見てみます。
http://port25...</description>
    <content:encoded><![CDATA[<p>オープンソースライセンスというのがよくわからないのでまとめてみました。<br />
突っ込み歓迎です。</p>
<p>ちなみに、以下は私の解釈なので、私以外の人がこれを信用した結果何か損害があっても一切責任を負わないものとします。</p>
<p><br />
とりあえず、公式な参考訳があるMS-PLを見てみます。<br />
<a href="http://port25.technet.com/Videos/downloads/MS-PL.htm">http://port25.technet.com/Videos/downloads/MS-PL.htm</a><br />
<a href="http://www.microsoft.com/japan/resources/sharedsource/licensingbasics/permissivelicense.mspx">http://www.microsoft.com/japan/resources/sharedsource/licensingbasics/permissivelicense.mspx</a></p>
<blockquote>
<p>1.定義<br />
&quot;複製する&quot;&quot;複製&quot;&quot;二次的著作物&quot;&quot;頒布&quot;(&quot;reproduce&quot; &quot;reproduction&quot; &quot;derivative works&quot; &quot;distribution&quot;)はアメリカの著作権法の言葉です。</p>
</blockquote>
<p>ここまではわかりやすいですね。</p>
<blockquote>
<p>&quot;コントリビューション&quot;(&quot;contribution&quot;)は配布しているもの(ソースコードとか実行ファイルとか)です。</p>
</blockquote>
<p>&hellip;&hellip;でいいのでしょうか。<br />
ソフトウェアに対する追加もしくは変更と言われてもピンとこないのですけど。</p>
<blockquote>
<p>&quot;コントリビューター&quot;(&quot;contributor&quot;)は配布している人です。</p>
</blockquote>
<p>コントリビューションを配布するもの、なのでたぶんこれで。</p>
<blockquote>
<p>&quot;対象特許&quot;(&quot;Licensed patents&quot;)は、コントリビューターが持っていてコントリビューションで使っている特許です。</p>
</blockquote>
<p>これも自信なし。<br />
と言うより日本語として怪しいのですけど。</p>
<blockquote>
<p>2.権利の付与<br />
(A)使用者がコントリビューションを使って「コントリビューションのコピー」「コントリビューションの二次著作物の作成」「コントリビューションおよび二次著作物の頒布」を自由に行って良いというライセンスを、コントリビューターは使用者に与えます。</p>
</blockquote>
<p>大変に意訳が入ってますが、「非独占的、世界全域、無償(non-exclusive, worldwide, royalty-free)」って事は「誰でも使える、世界で使える、無料で使える」って事ですよね?<br />
第3条についてはとりあえず読み飛ばします。</p>
<blockquote>
<p>(B)使用者がコントリビューションを使って「コントリビューションの二次著作物の作成」「二次著作物を他人に作らせる」「二次著作物を使用する」「二次著作物を売る」「二次著作物を売る提案をする」「二次著作物を輸入する」「そのほかの使い方をする」を自由に行って良いというライセンスを、コントリビューターは使用者に与えます。</p>
</blockquote>
<p>こちらも大変に意訳が。<br />
第3条についてはとりあえず読み飛ばします。<br />
一部A項と被っているような気もするのですけど&hellip;&hellip;</p>
<p>原文だと、A項はnon-exclusive, worldwide, royalty-free copyright license、B項はnon-exclusive, worldwide, royalty-free license under its licensed patentsとなっていますが、A項とB項で対象特許がどう絡んでいるのかがよくわかりません。</p>
<blockquote>
<p>3.条件および制限<br />
(A)コントリビューターの名前、ロゴ、商標は使っちゃダメ</p>
</blockquote>
<p>MS-PLなので大本はマイクロソフトな事が多そうですけど、MicrosoftとかWindowsとか使っちゃダメって事ですね。</p>
<blockquote>
<p>(B)本ソフトウェアに対して特許侵害を主張したら、特許ライセンスは終了</p>
</blockquote>
<p><strike>これは、使用者Xさんが特許侵害を主張したら、全使用者の特許ライセンスが終了ってことでしょうか。<br />
特許ライセンス&hellip;&hellip;?<br />
実は特許侵害してた事が発覚したら、もう使っちゃダメってあたりだと思うのですけど。</strike><br />
<a href="http://d.hatena.ne.jp/k3c/20070822/p1">http://d.hatena.ne.jp/k3c/20070822/p1</a>&nbsp;コメント欄より<br />
カウンター特許訴訟条項がある。もし誰かがMs-PLソフトウェアに対して特許訴訟を起こした場合、そいつはただちにそのMs-PLソフトウェアの利用許諾を失う。<br />
がこれだと思われます。</p>
<blockquote>
<p>(C)本ソフトウェアの全部または一部を配布する場合、著作権、特許権、商標、出所の表示を保持しなさい</p>
</blockquote>
<p>これもいまいち&hellip;&hellip;このライセンス下で配布されたプログラムとかDLLを使って何か別のものを作った場合、<br />
もとのプログラムの作成者とかをどこかに明記しなさいって事でしょうか。<br />
ソースコード形式で頒布されたものを使って何かソフトを作った場合も何かしないといけないのでしょうか。</p>
<blockquote>
<p>(D)本ソフトウェアの全部または一部をソースコード形式で頒布する場合、頒布物にライセンスの写しを入れて、このライセンスの下でのみ頒布出来ます。実行形式(exeとか?)またはオブジェクトコード形式(DLLとか?)で頒布する場合、本ライセンスに抵触しない条件のライセンスの下で頒布出来ます。</p>
</blockquote>
<p>つまり、このライセンスつけたら頒布出来るよって事ですよね。<br />
実行形式、オブジェクトコード形式ならもうちょっと違ってもいいよ、かな。</p>
<blockquote>
<p>(E)本ソフトウェアを使って何か損害があっても保証しないよ</p>
</blockquote>
<p>良くある一文ですよね&hellip;&hellip;&quot;as-is&quot;って定型文も入ってますし。<br />
<br />
と言うわけで。やっぱりいまいち分かってないですけど。</p>]]></content:encoded>
    <dc:subject>ライセンス</dc:subject>
    <dc:date>2010-05-19T21:49:08+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F7">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F7</link>
    <title>boost::spiritを使ってみた7</title>
    <description>今回はコメントの実装です。  つづきはこちら </description>
    <content:encoded><![CDATA[今回はコメントの実装です。<br /><a href="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F7" target="_blank">つづきはこちら</a>]]></content:encoded>
    <dc:subject>プログラム:boost</dc:subject>
    <dc:date>2009-10-25T18:26:55+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F6">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F6</link>
    <title>boost::spiritを使ってみた6</title>
    <description>というわけで本日の最終回。 
早速いってみましょうっ♪  つづきはこちら </description>
    <content:encoded><![CDATA[というわけで本日の最終回。<br />
早速いってみましょうっ♪<br /><a href="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F6" target="_blank">つづきはこちら</a>]]></content:encoded>
    <dc:subject>プログラム:boost</dc:subject>
    <dc:date>2009-10-19T22:42:16+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F5">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F5</link>
    <title>boost::spiritを使ってみた5</title>
    <description>今回は前回のコードを全然踏まえません。
前回1+2+3&amp;amp;hellip;&amp;amp;hellip;って感じの解析が出来ないレベルに退化したので、何とか戻そうとがんばった結果こうなりました。
たぶん正しい使い方が出来たんじゃないかな&amp;amp;hellip;&amp;amp;hellip;と自画自賛するのですっ♪つづきはこちら...</description>
    <content:encoded><![CDATA[今回は前回のコードを全然踏まえません。<br />
前回1+2+3&hellip;&hellip;って感じの解析が出来ないレベルに退化したので、何とか戻そうとがんばった結果こうなりました。<br />
たぶん正しい使い方が出来たんじゃないかな&hellip;&hellip;と自画自賛するのですっ♪<br /><a href="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F5" target="_blank">つづきはこちら</a>]]></content:encoded>
    <dc:subject>プログラム:boost</dc:subject>
    <dc:date>2009-10-19T22:26:30+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
  <item rdf:about="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F4">
    <link>https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F4</link>
    <title>boost::spiritを使ってみた4</title>
    <description> 意外と進展があったのでいきなり続きなど。   つづきはこちら </description>
    <content:encoded><![CDATA[<p>意外と進展があったのでいきなり続きなど。</p><br /><a href="https://100poisha.blog.shinobi.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-boost/boost--spirit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F4" target="_blank">つづきはこちら</a>]]></content:encoded>
    <dc:subject>プログラム:boost</dc:subject>
    <dc:date>2009-10-19T22:11:09+09:00</dc:date>
    <dc:creator>100poisha</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>100poisha</dc:rights>
  </item>
</rdf:RDF>
