OSDN Git Service

タグを打ち忘れていたついでに、html版ドキュメントを追加しました。
[ring-lang-081/ring.git] / docs / build / html / ringemb.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6   <head>
7     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8     
9     <title>Ring へ Ring を組み込むには &mdash; プログラミング言語 Ring 1.12 取扱説明書</title>
10     
11     <link rel="stylesheet" href="_static/bootstrap-astropy.css" type="text/css" />
12     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
13     
14     <script type="text/javascript">
15       var DOCUMENTATION_OPTIONS = {
16         URL_ROOT:    './',
17         VERSION:     '1.12',
18         COLLAPSE_INDEX: false,
19         FILE_SUFFIX: '.html',
20         HAS_SOURCE:  true
21       };
22     </script>
23     <script type="text/javascript" src="_static/jquery.js"></script>
24     <script type="text/javascript" src="_static/underscore.js"></script>
25     <script type="text/javascript" src="_static/doctools.js"></script>
26     <script type="text/javascript" src="_static/translations.js"></script>
27     <link rel="top" title="プログラミング言語 Ring 1.12 取扱説明書" href="index.html" />
28     <link rel="next" title="チュートリアル: C/C++ による拡張機能の開発方法" href="extension_tutorial.html" />
29     <link rel="prev" title="トレースライブラリとインタラクティブデバッガ" href="debug.html" />
30     <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,600' rel='stylesheet' type='text/css'/>
31
32   </head>
33   <body role="document">
34 <div class="topbar">
35   <a class="brand" title="Documentation Home" href="index.html"><span id="logotext1">&#x1f369;Ring</span><span id="logotext2"> 1.12</span><span id="logotext3">:docs</span></a>
36   <ul>
37     
38     <li><a href="http://ring-lang.sourceforge.net/news.html">News</a></li>
39     <li><a href="http://ring-lang.sourceforge.net/download.html">Download</a></li>
40     <li><a href="https://groups.google.com/forum/#!forum/ring-lang">Get Help</a></li>
41     <li><a href="https://github.com/ring-lang/ring">Contribute</a></li>
42     <li><a href="http://ring-lang.sourceforge.net/resources.html">Resources</a></li>
43     <li><a href="http://ring-lang.sourceforge.net/team.html">Team</a></li>
44     
45     <li><a title="Ring Homepage" href="http://ring-lang.net/">Website</a></li>
46     <li><a title="総合索引" href="genindex.html">Index</a></li>
47     <li>
48       
49       
50 <form action="search.html" method="get">
51   <input type="text" name="q" placeholder="Search" />
52   <input type="hidden" name="check_keywords" value="yes" />
53   <input type="hidden" name="area" value="default" />
54 </form>
55       
56     </li>
57   </ul>
58 </div>
59
60 <div class="related">
61     <h3>ナビゲーション</h3>
62     <ul>
63       <li class="right">
64         <a href="extension_tutorial.html" title="チュートリアル: C/C++ による拡張機能の開発方法">
65           next &raquo;
66         </a>
67       </li>
68       <li class="right">
69         <a href="debug.html" title="トレースライブラリとインタラクティブデバッガ">
70           &laquo; previous
71         </a>
72          |
73       </li>
74       <li>
75         <a href="index.html">プログラミング言語 Ring 1.12 取扱説明書</a>
76          &raquo;
77       </li>
78       
79       <li>Ring へ Ring を組み込むには</li> 
80     </ul>
81 </div>
82   
83
84     <div class="document">
85       <div class="documentwrapper">
86         <div class="bodywrapper">
87           <div class="body" role="main">
88             
89   <div class="section" id="ring-ring">
90 <span id="index-0"></span><h1>Ring へ Ring を組み込むには<a class="headerlink" href="#ring-ring" title="このヘッドラインへのパーマリンク">¶</a></h1>
91 <p>Ring プログラム、またはアプリケーションへ Ring を組み込む方法を学びます。</p>
92 <div class="section" id="index-1">
93 <span id="id1"></span><h2>ステートを共有せずに Ring へ Ring を組み込むには<a class="headerlink" href="#index-1" title="このヘッドラインへのパーマリンク">¶</a></h2>
94 <p>Ring 1.0 より Ring を C へ組み込むための関数は実装されていました。
95 また eval() 関数で Ring プログラム内で Ring のコードを実行できます。
96 この公開版では、ステートを共有せずに Ring を Ring プログラムへ組み込むための関数があります。</p>
97 <p>利点:</p>
98 <ol class="arabic simple">
99 <li>Ring プログラムとアプリケーションの統合で競合が発生しません。</li>
100 <li>Ring のコードを安全な環境で実行して、トレースを行えます。</li>
101 </ol>
102 <p>用例:</p>
103 <div class="highlight-ring"><div class="highlight"><pre><span class="n">pState</span> <span class="o">=</span> <span class="n">ring_state_init</span><span class="p">()</span>
104 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;See &#39;Hello, World!&#39;+nl&quot;</span><span class="p">)</span>
105 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;x = 10&quot;</span><span class="p">)</span>
106
107 <span class="n">pState2</span> <span class="o">=</span> <span class="n">ring_state_init</span><span class="p">()</span>
108 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState2</span><span class="p">,</span><span class="s">&quot;See &#39;Hello, World!&#39;+nl&quot;</span><span class="p">)</span>
109 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState2</span><span class="p">,</span><span class="s">&quot;x = 20&quot;</span><span class="p">)</span>
110
111 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;see x +nl&quot;</span><span class="p">)</span>
112 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState2</span><span class="p">,</span><span class="s">&quot;see x +nl&quot;</span><span class="p">)</span>
113
114 <span class="n">v1</span> <span class="o">=</span> <span class="n">ring_state_findvar</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;x&quot;</span><span class="p">)</span>
115 <span class="n">v2</span> <span class="o">=</span> <span class="n">ring_state_findvar</span><span class="p">(</span><span class="n">pState2</span><span class="p">,</span><span class="s">&quot;x&quot;</span><span class="p">)</span>
116
117 <span class="k">see</span> <span class="n">v1</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span> <span class="o">+</span> <span class="n">nl</span>
118 <span class="k">see</span> <span class="n">V2</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span> <span class="o">+</span> <span class="n">nl</span>
119
120 <span class="n">ring_state_delete</span><span class="p">(</span><span class="n">pState</span><span class="p">)</span>
121 <span class="n">ring_state_delete</span><span class="p">(</span><span class="n">pState2</span><span class="p">)</span>
122 </pre></div>
123 </div>
124 <p>実行結果:</p>
125 <div class="highlight-ring"><div class="highlight"><pre><span class="n">Hello</span><span class="p">,</span> <span class="n">World</span><span class="o">!</span>
126 <span class="n">Hello</span><span class="p">,</span> <span class="n">World</span><span class="o">!</span>
127 <span class="mi">10</span>
128 <span class="mi">20</span>
129 <span class="mi">10</span>
130 <span class="mi">20</span>
131 </pre></div>
132 </div>
133 </div>
134 <div class="section" id="index-2">
135 <span id="id2"></span><h2>プログラムの直列実行<a class="headerlink" href="#index-2" title="このヘッドラインへのパーマリンク">¶</a></h2>
136 <p>ring_state_main() 関数はアプリケーションの実行後に、別のアプリケーションを実行します。</p>
137 <p>用例:</p>
138 <div class="highlight-ring"><div class="highlight"><pre><span class="n">chdir</span><span class="p">(</span><span class="n">exefolder</span><span class="p">()</span><span class="o">+</span><span class="s">&quot;/../applications/formdesigner&quot;</span><span class="p">)</span>
139 <span class="n">ring_state_main</span><span class="p">(</span><span class="sc">&#39;formdesigner.ring&#39;</span><span class="p">)</span>
140 <span class="n">chdir</span><span class="p">(</span><span class="n">exefolder</span><span class="p">()</span><span class="o">+</span><span class="s">&quot;/../applications/cards&quot;</span><span class="p">)</span>
141 <span class="n">ring_state_main</span><span class="p">(</span><span class="sc">&#39;cards.ring&#39;</span><span class="p">)</span>
142 </pre></div>
143 </div>
144 </div>
145 <div class="section" id="ring-state-setvar">
146 <span id="index-3"></span><h2>ring_state_setvar()<a class="headerlink" href="#ring-state-setvar" title="このヘッドラインへのパーマリンク">¶</a></h2>
147 <p>ring_state_setvar() 関数は変数の値を設定します。</p>
148 <p>値には「文字列、数値、リスト、または C ポインタ」を指定します。</p>
149 <p>この関数は下位 Ring 環境へリストとC ポインタを手早く渡すために必要です。</p>
150 <p>文法:</p>
151 <div class="highlight-none"><div class="highlight"><pre>ring_state_setvar(oState,cVariableName,Value)
152 </pre></div>
153 </div>
154 <p>用例:</p>
155 <div class="highlight-ring"><div class="highlight"><pre><span class="k">load</span> <span class="s">&quot;guilib.ring&quot;</span>
156
157 <span class="n">myapp</span>   <span class="o">=</span> <span class="kp">null</span>
158 <span class="n">win</span>     <span class="o">=</span> <span class="kp">null</span>
159
160 <span class="k">func</span> <span class="n">main</span>
161         <span class="n">myapp</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qApp</span> <span class="p">{</span>
162                 <span class="n">win</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span>
163                         <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&quot;Advanced Example on using ring_state_setvar()&quot;</span><span class="p">)</span>
164                         <span class="n">move</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
165                         <span class="n">resize</span><span class="p">(</span><span class="mi">600</span><span class="p">,</span><span class="mi">400</span><span class="p">)</span>
166                         <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">win</span><span class="p">)</span> <span class="p">{</span>
167                                 <span class="n">setText</span><span class="p">(</span><span class="s">&quot;Test&quot;</span><span class="p">)</span>
168                                 <span class="n">setClickEvent</span><span class="p">(</span><span class="s">&quot;Test()&quot;</span><span class="p">)</span>
169                         <span class="p">}</span>
170                         <span class="c"># Qt でタイマーの作成とウィンドウを閉じる動作を行います。</span>
171                         <span class="c"># これだけでウィンドウを閉じるには不十分です。</span>
172                         <span class="c"># このために下位環境では load &#39;guilib.ring&#39; を</span>
173                         <span class="c"># 必ず使用してください。</span>
174                         <span class="n">oFilter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qAllEvents</span><span class="p">(</span><span class="n">win</span><span class="p">)</span>
175                         <span class="n">oFilter</span><span class="p">.</span><span class="n">setCloseEvent</span><span class="p">(</span><span class="s">&quot;myapp.quit()&quot;</span><span class="p">)</span>
176                         <span class="n">win</span><span class="p">.</span><span class="n">installeventfilter</span><span class="p">(</span><span class="n">oFilter</span><span class="p">)</span>
177                         <span class="n">show</span><span class="p">()</span>
178                 <span class="p">}</span>
179                 <span class="n">exec</span><span class="p">()</span>
180         <span class="p">}</span>
181
182 <span class="k">func</span> <span class="n">test</span>
183         <span class="n">pState</span> <span class="o">=</span> <span class="n">ring_state_init</span><span class="p">()</span>
184         <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pstate</span><span class="p">,</span><span class="s">&quot;load &#39;guilib.ring&#39;&quot;</span><span class="p">)</span>
185         <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;x = NULL&quot;</span><span class="p">)</span>
186         <span class="c"># 文字列を渡します。</span>
187                 <span class="n">ring_state_setvar</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;x&quot;</span><span class="p">,</span><span class="s">&quot;hello&quot;</span><span class="p">)</span>
188                 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;? x&quot;</span><span class="p">)</span>
189         <span class="c"># 数値を渡します。</span>
190                 <span class="n">ring_state_setvar</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;x&quot;</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
191                 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;? x&quot;</span><span class="p">)</span>
192         <span class="c"># Pass List</span>
193                 <span class="n">ring_state_setvar</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;x&quot;</span><span class="p">,</span><span class="o">[</span><span class="s">&quot;one&quot;</span><span class="p">,</span><span class="s">&quot;two&quot;</span><span class="p">,</span><span class="s">&quot;three&quot;</span><span class="o">]</span><span class="p">)</span>
194                 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;? x&quot;</span><span class="p">)</span>
195         <span class="c"># リストを渡します。</span>
196         <span class="c"># Ring オブジェクトを渡すことはできません (win)。</span>
197         <span class="c"># 理由としてオブジェクトはクラス情報のポインタとして格納されているからです。</span>
198         <span class="c"># またクラスは Ring の親環境と関連付けられています。</span>
199         <span class="c"># しかし、下位 Ring 環境にはアクセスできません。</span>
200         <span class="c"># ですが win.pObject のようにすれば C ポインタを渡せます。</span>
201                 <span class="n">ring_state_setvar</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;x&quot;</span><span class="p">,</span><span class="n">win</span><span class="p">.</span><span class="n">pObject</span><span class="p">)</span>
202         <span class="c"># さて、オブジェクトを再作成しましたが同じ C ポインタを使用しています。</span>
203         <span class="c"># したがって親 Ring 環境にある同じウィンドウへアクセスできます。</span>
204                 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;</span>
205                         <span class="k">new</span> <span class="n">qWidget</span> <span class="p">{</span>
206                                 <span class="n">pObject</span> <span class="o">=</span> <span class="n">x</span>
207                                 <span class="n">setwindowtitle</span><span class="p">(</span><span class="sc">&#39;Message from the Sub Ring Environment&#39;</span><span class="p">)</span>
208                         <span class="p">}</span>
209                 <span class="s">&quot;)</span>
210         <span class="n">ring_state_delete</span><span class="p">(</span><span class="n">pState</span><span class="p">)</span>
211 </pre></div>
212 </div>
213 </div>
214 <div class="section" id="ring-state-new-ring-state-mainfile">
215 <span id="index-4"></span><h2>ring_state_new() と ring_state_mainfile() 関数<a class="headerlink" href="#ring-state-new-ring-state-mainfile" title="このヘッドラインへのパーマリンク">¶</a></h2>
216 <p>ring_state_new() と ring_state_mainfile() 関数は Ring プログラムから別の Ring プログラムを実行します。</p>
217 <p>ring_state_main() 関数とは異なり、こちらは Ring ステートの削除時に制御できます!</p>
218 <p>これは GUI プログラムから別の GUI プログラムを実行するときに重要です。</p>
219 <p>この場合の理由は GUI ライブラリ (RingQt) を共有しており、</p>
220 <p>呼び出し元は qApp.Exec() を呼び出すからです。</p>
221 <p>よって、下位プログラムを停止せずにメインプログラムへ戻ります。</p>
222 <p>ここで下位プログラムのステートを削除してしまうと、下位プログラムのイベント実行時に問題が発生します。</p>
223 <p>ステートを保持することは、下位 GUI プログラムの収容先となっている GUI プログラムでは重要です。</p>
224 <p>用例:</p>
225 <div class="highlight-ring"><div class="highlight"><pre><span class="k">load</span> <span class="s">&quot;guilib.ring&quot;</span>
226
227 <span class="k">func</span> <span class="n">main</span>
228         <span class="k">new</span> <span class="n">qApp</span> <span class="p">{</span>
229                 <span class="n">win</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span>
230                         <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&quot;Test ring_state_mainfile()&quot;</span><span class="p">)</span>
231                         <span class="n">resize</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span><span class="mi">400</span><span class="p">)</span> <span class="n">move</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
232                         <span class="n">btn</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">Win</span><span class="p">)</span> <span class="p">{</span>
233                                 <span class="n">settext</span><span class="p">(</span><span class="s">&quot;test&quot;</span><span class="p">)</span>
234                                 <span class="n">setclickevent</span><span class="p">(</span><span class="s">&quot;mytest()&quot;</span><span class="p">)</span>
235                         <span class="p">}</span>
236                         <span class="n">show</span><span class="p">()</span>
237                 <span class="p">}</span>
238                 <span class="n">exec</span><span class="p">()</span>
239         <span class="p">}</span>
240
241 <span class="k">func</span> <span class="n">mytest</span>
242         <span class="n">pState</span> <span class="o">=</span> <span class="n">ring_state_new</span><span class="p">()</span>
243         <span class="n">ring_state_mainfile</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot;runprogram.ring&quot;</span><span class="p">)</span>
244         <span class="c"># ここで GUI アプリケーションを実行する場合はステートを削除しないでください。</span>
245         <span class="c"># なお GUI アプリケーションのイベントを実行できます。</span>
246                 <span class="o">//</span> <span class="n">ring_state_delete</span><span class="p">(</span><span class="n">pState</span><span class="p">)</span>
247 </pre></div>
248 </div>
249 <p>この機能を使用する場合は、前述の用例を基にアプリケーションで必要な更新をすることを覚えておいてください。</p>
250 <p>この時点で ring_state_delete() 関数を呼び出すとメモリリークを回避できます!</p>
251 </div>
252 <div class="section" id="index-5">
253 <span id="id3"></span><h2>Ring へ Ring を組み込んだときのランタイムエラーについて<a class="headerlink" href="#index-5" title="このヘッドラインへのパーマリンク">¶</a></h2>
254 <p>Ring 1.8 から Ring へ Ring を組み込んだときに、</p>
255 <p>ゲスト環境でエラーが発生してもホストは異常終了しなくなりました。</p>
256 <p>用例:</p>
257 <div class="highlight-ring"><div class="highlight"><pre><span class="o">?</span> <span class="s">&quot;Start the test!&quot;</span>
258
259 <span class="n">pState</span> <span class="o">=</span> <span class="n">ring_state_init</span><span class="p">()</span>
260
261 <span class="n">ring_state_runcode</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="s">&quot; ? &#39;Let us try having an error&#39; ? x&quot;</span><span class="p">)</span>
262
263 <span class="n">ring_state_delete</span><span class="p">(</span><span class="n">pState</span><span class="p">)</span>
264
265 <span class="o">?</span> <span class="s">&quot;&quot;</span>
266 <span class="o">?</span> <span class="s">&quot;End of test!&quot;</span>
267 </pre></div>
268 </div>
269 <p>実行結果:</p>
270 <div class="highlight-none"><div class="highlight"><pre>Start the test!
271 Let us try having an error
272
273 Line 1 Error (R24) : Using uninitialized variable : x
274 in file Ring_EmbeddedCode
275 End of test!
276 </pre></div>
277 </div>
278 </div>
279 <div class="section" id="ring-state-filetokens">
280 <span id="index-6"></span><h2>ring_state_filetokens() 関数<a class="headerlink" href="#ring-state-filetokens" title="このヘッドラインへのパーマリンク">¶</a></h2>
281 <p>Ring 1.12 では ring_state_filetokens() 関数に対応しました。</p>
282 <p>ring_state_filetokens() 関数は Ring ソースコードファイルにあるトークンを一括取得します。</p>
283 <div class="highlight-ring"><div class="highlight"><pre><span class="n">C_FILENAME</span>      <span class="o">=</span> <span class="s">&quot;test_tokens.ring&quot;</span>
284 <span class="n">C_WIDTH</span>         <span class="o">=</span> <span class="mi">12</span>
285
286 <span class="c"># ファイルの書き込み</span>
287         <span class="n">write</span><span class="p">(</span><span class="n">C_FILENAME</span><span class="p">,</span><span class="sc">&#39;</span>
288                         <span class="k">see</span> <span class="s">&quot;Hello, World!&quot;</span>
289                         <span class="o">?</span> <span class="mi">3</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">3</span>
290                         <span class="n">Name</span> <span class="o">=</span> <span class="s">&quot;Ring&quot;</span>
291                         <span class="o">?</span> <span class="n">Name</span>
292 <span class="sc">&#39;)</span>
293
294 <span class="c"># トークンの種類</span>
295         <span class="n">C_KEYWORD</span>       <span class="o">=</span> <span class="mi">0</span>
296         <span class="n">C_OPERATOR</span>      <span class="o">=</span> <span class="mi">1</span>
297         <span class="n">C_LITERAL</span>       <span class="o">=</span> <span class="mi">2</span>
298         <span class="n">C_NUMBER</span>        <span class="o">=</span> <span class="mi">3</span>
299         <span class="n">C_IDENTIFIER</span>    <span class="o">=</span> <span class="mi">4</span>
300         <span class="n">C_ENDLINE</span>       <span class="o">=</span> <span class="mi">5</span>
301
302 <span class="c"># キーワードリスト</span>
303 <span class="n">aKEYWORDS</span> <span class="o">=</span> <span class="o">[</span><span class="s">&quot;IF&quot;</span><span class="p">,</span><span class="s">&quot;TO&quot;</span><span class="p">,</span><span class="s">&quot;OR&quot;</span><span class="p">,</span><span class="s">&quot;AND&quot;</span><span class="p">,</span><span class="s">&quot;NOT&quot;</span><span class="p">,</span><span class="s">&quot;FOR&quot;</span><span class="p">,</span><span class="s">&quot;NEW&quot;</span><span class="p">,</span><span class="s">&quot;FUNC&quot;</span><span class="p">,</span>
304 <span class="s">&quot;FROM&quot;</span><span class="p">,</span><span class="s">&quot;NEXT&quot;</span><span class="p">,</span><span class="s">&quot;LOAD&quot;</span><span class="p">,</span><span class="s">&quot;ELSE&quot;</span><span class="p">,</span><span class="s">&quot;SEE&quot;</span><span class="p">,</span><span class="s">&quot;WHILE&quot;</span><span class="p">,</span><span class="s">&quot;OK&quot;</span><span class="p">,</span><span class="s">&quot;CLASS&quot;</span><span class="p">,</span><span class="s">&quot;RETURN&quot;</span><span class="p">,</span><span class="s">&quot;BUT&quot;</span><span class="p">,</span>
305 <span class="s">&quot;END&quot;</span><span class="p">,</span><span class="s">&quot;GIVE&quot;</span><span class="p">,</span><span class="s">&quot;BYE&quot;</span><span class="p">,</span><span class="s">&quot;EXIT&quot;</span><span class="p">,</span><span class="s">&quot;TRY&quot;</span><span class="p">,</span><span class="s">&quot;CATCH&quot;</span><span class="p">,</span><span class="s">&quot;DONE&quot;</span><span class="p">,</span><span class="s">&quot;SWITCH&quot;</span><span class="p">,</span><span class="s">&quot;ON&quot;</span><span class="p">,</span><span class="s">&quot;OTHER&quot;</span><span class="p">,</span><span class="s">&quot;OFF&quot;</span><span class="p">,</span>
306 <span class="s">&quot;IN&quot;</span><span class="p">,</span><span class="s">&quot;LOOP&quot;</span><span class="p">,</span><span class="s">&quot;PACKAGE&quot;</span><span class="p">,</span><span class="s">&quot;IMPORT&quot;</span><span class="p">,</span><span class="s">&quot;PRIVATE&quot;</span><span class="p">,</span><span class="s">&quot;STEP&quot;</span><span class="p">,</span><span class="s">&quot;DO&quot;</span><span class="p">,</span><span class="s">&quot;AGAIN&quot;</span><span class="p">,</span><span class="s">&quot;CALL&quot;</span><span class="p">,</span><span class="s">&quot;ELSEIF&quot;</span><span class="p">,</span>
307 <span class="s">&quot;PUT&quot;</span><span class="p">,</span><span class="s">&quot;GET&quot;</span><span class="p">,</span><span class="s">&quot;CASE&quot;</span><span class="p">,</span><span class="s">&quot;DEF&quot;</span><span class="p">,</span><span class="s">&quot;ENDFUNC&quot;</span><span class="p">,</span><span class="s">&quot;ENDCLASS&quot;</span><span class="p">,</span><span class="s">&quot;ENDPACKAGE&quot;</span><span class="p">,</span>
308 <span class="s">&quot;CHANGERINGKEYWORD&quot;</span><span class="p">,</span><span class="s">&quot;CHANGERINGOPERATOR&quot;</span><span class="p">,</span><span class="s">&quot;LOADSYNTAX&quot;</span><span class="o">]</span>
309
310 <span class="n">pState</span> <span class="o">=</span> <span class="n">ring_state_new</span><span class="p">()</span>
311 <span class="n">aList</span> <span class="o">=</span> <span class="n">ring_state_filetokens</span><span class="p">(</span><span class="n">pState</span><span class="p">,</span><span class="n">C_FILENAME</span><span class="p">)</span>
312 <span class="n">PrintTokens</span><span class="p">(</span><span class="n">aList</span><span class="p">)</span>
313 <span class="n">ring_state_delete</span><span class="p">(</span><span class="n">pState</span><span class="p">)</span>
314
315 <span class="k">func</span> <span class="n">PrintTokens</span> <span class="n">aList</span>
316         <span class="k">for</span> <span class="n">aToken</span> <span class="k">in</span> <span class="n">aList</span>
317                 <span class="k">switch</span> <span class="n">aToken</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span>
318                 <span class="k">on</span> <span class="n">C_KEYWORD</span>
319                         <span class="o">?</span> <span class="n">Width</span><span class="p">(</span><span class="s">&quot;Keyword&quot;</span><span class="p">,</span><span class="n">C_WIDTH</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;: &quot;</span>  <span class="o">+</span> <span class="n">aKeywords</span><span class="o">[</span><span class="mi">0</span><span class="o">+</span><span class="n">aToken</span><span class="o">[</span><span class="mi">2</span><span class="o">]]</span>
320                 <span class="k">on</span> <span class="n">C_OPERATOR</span>
321                         <span class="o">?</span> <span class="n">Width</span><span class="p">(</span><span class="s">&quot;Operator&quot;</span><span class="p">,</span><span class="n">C_WIDTH</span><span class="p">)</span>  <span class="o">+</span> <span class="s">&quot;: &quot;</span> <span class="o">+</span> <span class="n">aToken</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span>
322                 <span class="k">on</span> <span class="n">C_LITERAL</span>
323                         <span class="o">?</span> <span class="n">Width</span><span class="p">(</span><span class="s">&quot;Literal&quot;</span><span class="p">,</span><span class="n">C_WIDTH</span><span class="p">)</span>  <span class="o">+</span> <span class="s">&quot;: &quot;</span> <span class="o">+</span> <span class="n">aToken</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span>
324                 <span class="k">on</span> <span class="n">C_NUMBER</span>
325                         <span class="o">?</span> <span class="n">Width</span><span class="p">(</span><span class="s">&quot;Number&quot;</span><span class="p">,</span><span class="n">C_WIDTH</span><span class="p">)</span>  <span class="o">+</span> <span class="s">&quot;: &quot;</span> <span class="o">+</span> <span class="n">aToken</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span>
326                 <span class="k">on</span> <span class="n">C_IDENTIFIER</span>
327                         <span class="o">?</span> <span class="n">Width</span><span class="p">(</span><span class="s">&quot;Identifier&quot;</span><span class="p">,</span><span class="n">C_WIDTH</span><span class="p">)</span>  <span class="o">+</span> <span class="s">&quot;: &quot;</span> <span class="o">+</span> <span class="n">aToken</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span>
328                 <span class="k">on</span> <span class="n">C_ENDLINE</span>
329                         <span class="o">?</span> <span class="s">&quot;EndLine&quot;</span>
330                 <span class="k">other</span>
331
332                 <span class="k">off</span>
333         <span class="k">next</span>
334
335 <span class="k">func</span> <span class="n">Width</span> <span class="n">cText</span><span class="p">,</span><span class="n">nWidth</span>
336         <span class="k">return</span> <span class="n">cText</span><span class="o">+</span><span class="n">copy</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">,</span><span class="n">nWidth</span><span class="o">-</span><span class="n">len</span><span class="p">(</span><span class="n">cText</span><span class="p">))</span>
337 </pre></div>
338 </div>
339 <p>実行結果:</p>
340 <div class="highlight-none"><div class="highlight"><pre>EndLine
341 Keyword     : SEE
342 Literal     : Hello, World!
343 EndLine
344 Operator    : ?
345 Number      : 3
346 Operator    : *
347 Number      : 2
348 Operator    : +
349 Number      : 3
350 EndLine
351 Identifier  : name
352 Operator    : =
353 Literal     : Ring
354 EndLine
355 Operator    : ?
356 Identifier  : name
357 EndLine
358 </pre></div>
359 </div>
360 </div>
361 </div>
362
363
364           </div>
365         </div>
366       </div>
367       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
368         <div class="sphinxsidebarwrapper"><h3>ページの内容</h3>
369 <ul>
370 <li><a class="reference internal" href="#">Ring へ Ring を組み込むには</a><ul>
371 <li><a class="reference internal" href="#index-1">ステートを共有せずに Ring へ Ring を組み込むには</a></li>
372 <li><a class="reference internal" href="#index-2">プログラムの直列実行</a></li>
373 <li><a class="reference internal" href="#ring-state-setvar">ring_state_setvar()</a></li>
374 <li><a class="reference internal" href="#ring-state-new-ring-state-mainfile">ring_state_new() と ring_state_mainfile() 関数</a></li>
375 <li><a class="reference internal" href="#index-5">Ring へ Ring を組み込んだときのランタイムエラーについて</a></li>
376 <li><a class="reference internal" href="#ring-state-filetokens">ring_state_filetokens() 関数</a></li>
377 </ul>
378 </li>
379 </ul>
380
381
382   <h4>前のトピックへ</h4>
383   <p class="topless"><a href="debug.html"
384                         title="前の章へ">トレースライブラリとインタラクティブデバッガ</a></p>
385   <h4>次のトピックへ</h4>
386   <p class="topless"><a href="extension_tutorial.html"
387                         title="次の章へ">チュートリアル: C/C++ による拡張機能の開発方法</a></p>
388   <div role="note" aria-label="source link">
389     <h3>このページ</h3>
390     <ul class="this-page-menu">
391       <li><a href="_sources/ringemb.txt"
392             rel="nofollow">ソースコードを表示</a></li>
393     </ul>
394    </div>
395       
396 <form action="search.html" method="get">
397   <input type="text" name="q" placeholder="Search" />
398   <input type="hidden" name="check_keywords" value="yes" />
399   <input type="hidden" name="area" value="default" />
400 </form>
401       
402         </div>
403       </div>
404       <div class="clearer"></div>
405     </div>
406 <footer class="footer">
407   <p class="pull-right">
408     <a href="_sources/ringemb.txt"
409        rel="nofollow">Page Source</a> &nbsp;
410     <a href="#">Back to Top</a></p>
411   <p>
412     &copy; Copyright 2016-2020, Ring Team.<br/>
413     Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 1.3.6. / astropy-sphinx-theme 1.1 (isVowel)
414   </p>
415 </footer>
416   </body>
417 </html>