OSDN Git Service

decad981ebe72251180f0ef8fb3ced46c037567c
[ring-lang-081/ring.git] / docs / build / html / faq.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>よくある質問と回答 (FAQ) &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="一般情報" href="generalinfo.html" />
29     <link rel="prev" title="はじめての拡張機能開発" href="ringbeep.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="generalinfo.html" title="一般情報">
65           next &raquo;
66         </a>
67       </li>
68       <li class="right">
69         <a href="ringbeep.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>よくある質問と回答 (FAQ)</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="faq">
90 <span id="index-0"></span><h1>よくある質問と回答 (FAQ)<a class="headerlink" href="#faq" title="このヘッドラインへのパーマリンク">¶</a></h1>
91 <div class="section" id="yapl">
92 <span id="index-1"></span><h2>第三のプログラミング言語 (YAPL) は必要か?<a class="headerlink" href="#yapl" title="このヘッドラインへのパーマリンク">¶</a></h2>
93 <p>プログラミング言語 Supernova では「I want window and the window title is hello world.」と入力すると
94 “Hello, World!” のウィンドウタイトルで GUI ウィンドウを作成できます。</p>
95 <p>つまり、自然言語コードにより「英語のように制限なくプログラミングで人間の言語能力を発揮できる」ことを発見しましたが、
96 実現には新しいプログラミング言語が必要です。</p>
97 <ol class="arabic simple">
98 <li>汎用性</li>
99 <li>実用性</li>
100 <li>非常に手軽な方法で自然言語プログラムの作成ができます。</li>
101 </ol>
102 <p>使いやすく、生産性を最大限まで押し上げることができるシステムを享受できます。</p>
103 <p>目的を達成する最良の方法として Ring を作成しました。</p>
104 <p>Supernova はアイディアの検証であり、どのような利点と欠点があるかについての見識を得るために役に立ちました。
105 新しいアイディアの検証後に実用的なプログラミング言語があります。
106 Supernova の後に Ring があります。 ABC の後に Python が存在するのと同じ物語です。
107 Python は ABC の問題を回避していますが ABC の利点をもたらします。
108 Ring は Ruby と Ruby on Rails (ROR) の伝説を学んでいます。
109 プログラミング言語の実力は、汎用プログラミング言語の直接的な用法による優れたフレームワークに最も現れます。
110 また Ring には明確な目的と動機である「次世代版 Programming Without Coding Technology (PWCT) ソフトウェアの開発」があり、
111 C 言語で Unix オペレーティングシステムが設計されたことも学んでいます。
112 言い換えれば、各々の設計判断で決定する目標があります。</p>
113 <p>さて、質問です。計算機プログラミングの概念に関する知識を持たずに、非常に強力なソフトウェアを製作できますか? 科学的な答えは「ビジュアル・プログラミング」と「自然言語プログラミング」です。
114 実際には、ほかに問題をもたらすことなく、パラダイムを切り替えることはありません。</p>
115 <p>Ring (コンパイラ + 仮想計算機) の設計と開発、および C コードの生成では、
116 ビジュアル・プログラミング言語「Programming Without Coding Technology (PWCT)」を 100% 使用しています (一行たりとも手作業でのコーディングはしていません)。</p>
117 <p>Programming Without Coding Technology (PWCT) の利点は?</p>
118 <ol class="arabic simple">
119 <li>高速化。</li>
120 <li>シンタックスエラーとは無縁となります。</li>
121 <li>高水準の抽象化となるためコードの理解と管理は容易になります。</li>
122 <li>コードの記述はすべて管理できるため致命的な欠点はなくなります。</li>
123 </ol>
124 <p>上述のアイディアへの対応、パラダイム切り替え時に発生する問題の解決、強力なビジュアル・プログラミングツールの開発のための言語設計 (Qt対応などユーザインタフェースの作成機能を最重要視)、未来のコード不要プログラミング (自然言語の使用) 対応のための設計、実用的手法による自然言語プログラミングの実現、多種多様な方法での問題解決、および画期的かつ問題解決方法に関するアイディアの支援。</p>
125 <p>そして、C, C++, C#, Lua, PHP, Python, Ruby, Harbour, Basic と Supernova などのプログラミング言語の豊富な経験とビジュアル・プログラミング (使用経験十年以上)、および自然言語プログラミング (使用経験五年以上) の長期にわたる研究の集大成として、現役プログラマの認識へ変革をもたらし実用プログラミング言語の新天地と成るべく Ring を設計・開発しました。</p>
126 <p>プログラミング言語もそうですが、ソフトウェアの分野・用途を問わず、プログラマ、または開発者は意見や批評をする自由があります。 Ring も例外ではなく、ドキュメントの練度・整備不足による誤解、あるいはプログラマによく知られているがために背景にあるアイディアを見落してしまい、新規性がないと評価・判断を誤り、誤解されてしまう各種機能があります。</p>
127 <p>設計段階から実装段階へ移行後に、新たに自然言語インタフェースの実装を行ってから、
128 ソフトウェアを言葉で表現することにより、プログラミングを開始します (筆者としては、アイジャル・メソッドは自由であり、
129 移行段階や移行時期についての決定は行いません)。</p>
130 <p>Ring は新興プログラミング言語であるため、選択肢は三つあります:</p>
131 <ol class="arabic simple">
132 <li>今は気にしません。</li>
133 <li>Ring の将来について考え、プログラミング言語に関する考えを理解して貢献したいのでしたら、ご支援をお願いします。</li>
134 <li>ご期待に添えず申し訳ございません。また数年後の使用再開をお待ちしております。</li>
135 </ol>
136 <div class="section" id="id1">
137 <h3>まとめ<a class="headerlink" href="#id1" title="このヘッドラインへのパーマリンク">¶</a></h3>
138 <ul class="simple">
139 <li>Programming Without Coding Technology (PWCT) 2.0 の完成後は Ring で高品質かつ大規模ソフトウェアを開発できるようになります。</li>
140 <li>宣言型と自然言語パラダイムを段階的に押し進めていきます。</li>
141 <li>次の公開版では、ネットワーク・プログラミングと平行性のために、新しいパラダイムの実装計画があります。去年、簡易試作品で新しいパラダイムを検証しました。なお、将来の公開版で Ring と統合する予定です。</li>
142 </ul>
143 </div>
144 </div>
145 <div class="section" id="index-2">
146 <span id="id2"></span><h2>なぜ弱い型付けを採用したのですか?<a class="headerlink" href="#index-2" title="このヘッドラインへのパーマリンク">¶</a></h2>
147 <p>これは最初の目標で重要なことです。
148 高速化と違和感の排除になるからです。
149 最初の規則: 最初のデータ型は最後の結果に影響します。
150 例えば &#8220;Print : &#8221; + 5 を入力すると、最初に文字列の 5 が表示された後に 5 は文字列へ変換されます。
151 そして 5 + &#8220;10&#8221; と入力すると最初に数値の &#8220;10&#8221; が表示された後に &#8220;10&#8221; は 10 へ変換されます。
152 これは同じ演算子を使用して数値と文字列との間で、すばやく変換するのに大いに役に立ちます。
153 変換を防ぎたい場合は (変換を防ぐコードを記述します)、コードの記述量がより少ない (さらに削除可能) ことに気付くと思います。</p>
154 <p>弱い型付け = 自動変換と <em>自動処理</em> は <em>優れたもの</em> であり、
155 正しく使用されている場合は <em>手動処理</em> より優れています。</p>
156 </div>
157 <div class="section" id="lisp-smalltalk-ring">
158 <span id="index-3"></span><h2>Lisp や Smalltalk よりも Ring を選ぶ利点は?<a class="headerlink" href="#lisp-smalltalk-ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
159 <p>Smalltalk と Lisp は、すばらしいプログラミング言語あり、背景にある様々な概念を気に入っています。
160 しかし、問題に基づいて適切なプログラミング言語を選択した後であれば、問題を定義できると確信しています。
161 筆者には解決したい問題があり、この問題において、前述のすばらしいプログラミング言語は理想的ではなかったので Ring を設計しました。</p>
162 <p>新しいプログラミング言語を設計するとき、過去から学べますが、
163 将来を見据えて未来へ向かって進まなくてダメなのです。おそらく、
164 読者は自然言語プログラミングの知識に関して、古典的知識に基づいていることは筆者も同意しますが、
165 別技法の実践により、これを実務に取り入れることができることを確認しています。
166 自然言語に関して読者が誤解していることは <em>文脈依存</em> です。
167 つまり、アイディアの表現方法に関して色々と考えることで使用できるようになります。</p>
168 <p>用例 : I want window contains 3 buttons.</p>
169 <p>一文で四つのオブジェクト (ウィンドウと三つのボタン) の作成を行い、ウィンドウへボタンを追加しました。
170 このような様々な物事を取り入れるのが、自然言語プログラミングの考えかたです。</p>
171 </div>
172 <div class="section" id="c-c-ring">
173 <span id="index-4"></span><h2>ネイティブ C や C++ よりも Ring を選ぶ利点は?<a class="headerlink" href="#c-c-ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
174 <p>Ring 言語では、多種多様なプログラミングパラダイムをまとめて扱うことができます。</p>
175 <ol class="arabic">
176 <li><p class="first">言語構成要素では、類似の概念に関して類似のシンタックスを使用するため、あるプログラミングパラダイムから別のプログラミングパラダイムへの移行は容易です。</p>
177 </li>
178 <li><dl class="first docutils">
179 <dt>パラダイムには相互作用性があり、ソフトウェアでは異なる階層で併用されます。</dt>
180 <dd><p class="first last">例えば、ゲームエンジンの作成はオブジェクト指向プログラミングで、
181 ゲームのコードは宣言型プログラミング、または自然言語プログラミングで記述を行い、
182 シーンの背後では宣言型、または自然言語のコードはオブジェクト指向クラスを使えます。</p>
183 </dd>
184 </dl>
185 </li>
186 <li><p class="first">Ring は C/C++ よりも生産性が高く、違和感がありません。</p>
187 </li>
188 <li><p class="first">Ring は、動的プログラミング言語です。実行中にコードの生成と実行ができます。 Ring は動的型付け言語であり、柔軟性のために弱い型付けを採用しています。</p>
189 </li>
190 <li><p class="first">ガベージコレクターは、世代間 (エスケープ解析) および参照カウント方式で実装しています。非常に高速であり、さらにプログラマへ制御権を委任することで、いつでもメモリからデータを削除できます。</p>
191 </li>
192 <li><p class="first">C/C++ ライブラリを使えます。 Ring には C 関数または C++ クラスからラッパーを作成するために、コード生成器が付属しています。さらなる処理能力を求めている、またはもっとライブラリを使用する必要がある場合は、簡単に実現できます。</p>
193 </li>
194 </ol>
195 </div>
196 <div class="section" id="ring-python-ring">
197 <span id="index-5"></span><h2>Ring と Python との違いは?  Ring はオープンソースなの?<a class="headerlink" href="#ring-python-ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
198 <p>もちろん。 Ring はオープンソースです (MIT ライセンス)。</p>
199 <p>全般的に筆者は Python と Ruby が好きですが、筆者には目的となる単純明快な変更があります。</p>
200 <ol class="arabic simple">
201 <li>英数大小文字の区別はしません。</li>
202 <li>リストのインデックスは 1  から開始します。</li>
203 <li>関数の定義前に呼び出せます。</li>
204 <li>Python 風のシンタックスを使用しない (インデント、self の使用、pass &amp; _)</li>
205 <li>弱い型付け (コンテキストに基づいた型の間での自動変換)</li>
206 <li>プログラムは、単純明快な一定の構造に従います (ステートメントの後に関数、続いてパッケージとクラス)。</li>
207 <li>代入と値のテストで ‘=’ 演算子の使用。</li>
208 </ol>
209 <p>重要な変更は、</p>
210 <ol class="arabic simple">
211 <li>数日で習得できる単純明快な小規模プログラミング言語: Ring コンパイラ + 仮想計算機 = 約 20,000 行の ANSI C コード (すべてのプラットフォームでコンパイル可能)。ほかにライブラリ関連と C/C++ プログラム用のオプションで 500,000 行。</li>
212 <li>ガベージコレクター: エスケープ解析・参照カウント方式の採用、および代入演算子の使用によりメモリの削除を行う機会をプログラマが決定する権限を与えています。</li>
213 <li>簡潔なシンタックス: Ring では、行は重要ではありません。 ; の記述または ENTER を押してステートメントを区切る必要はありません。</li>
214 <li>直接、オブジェクトの属性とメソッドを使用した後は { } で、オブジェクトへアクセスします。</li>
215 <li>自然言語プログラミング: オブジェクト指向プログラミングに基づき Ring を使うと違和感のない自然なインタフェースの作成が非常に簡単になります。</li>
216 <li>入れ子構造の宣言型プログラミング</li>
217 </ol>
218 <p>さらに、 Ring の目的を達成するために、画期的な機能が追加されています (参照: 言語設計 - 明確な目標のための設計)。</p>
219 </div>
220 <div class="section" id="perl-php-python-ruby-ring">
221 <span id="index-6"></span><h2>Perl, PHP, Python や Ruby よりも Ring を使用する利点は?<a class="headerlink" href="#perl-php-python-ruby-ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
222 <ol class="arabic simple">
223 <li>Ring は多機能で違和感がない上に、画期的で新規性があります。コードも美しく、簡潔で分かりやすく記述できます。 Ring はプログラミングに関する様々なことを考えさせられます。</li>
224 <li>Ring は小規模言語として設計されています (Lua 言語からの教訓)。</li>
225 <li>Ring は単純明快です (BASIC と Clipper/Harbour 言語からの教訓)。</li>
226 <li>Ring はより自然言語的です (Supernova 言語からの教訓)。</li>
227 <li>Ring はより宣言的です (REBOL と QML 言語からの教訓)。</li>
228 <li>Ring の実装は透過性があり、視覚的であり、さらに豪華な機能があります。</li>
229 </ol>
230 <p>なお、 Ring は PHP, Lua  Tcl や Smalltalk などの改良品や代用品として設計しておりません。</p>
231 </div>
232 <div class="section" id="c-java-ring">
233 <span id="index-7"></span><h2>C# や Java よりも Ring を使用する利点は?<a class="headerlink" href="#c-java-ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
234 <ol class="arabic simple">
235 <li>簡潔なコード (きれいで違和感がない)、生産性と柔軟性の向上。</li>
236 <li>宣言型プログラミング、および自然言語プログラミングに関する対応の改善。</li>
237 </ol>
238 </div>
239 <div class="section" id="index-8">
240 <span id="id3"></span><h2>関数型プログラミングへの対応が言及されていますが、これは他になにが起きますか?<a class="headerlink" href="#index-8" title="このヘッドラインへのパーマリンク">¶</a></h2>
241 <p>このコードに関する質問です:</p>
242 <div class="highlight-ring"><div class="highlight"><pre><span class="n">f</span> <span class="o">=</span> <span class="k">func</span> <span class="p">{</span>
243     <span class="n">a</span> <span class="o">=</span> <span class="mi">42</span>
244     <span class="k">return</span> <span class="k">func</span> <span class="p">{</span> <span class="k">return</span> <span class="n">a</span> <span class="p">}</span>
245 <span class="p">}</span>
246
247 <span class="n">innerF</span> <span class="o">=</span> <span class="k">call</span> <span class="n">f</span><span class="p">()</span>
248 <span class="k">call</span> <span class="n">innerF</span><span class="p">()</span>
249 </pre></div>
250 </div>
251 <p>実行結果:</p>
252 <div class="highlight-none"><div class="highlight"><pre>Using uninitialized variable : a In function _ring_anonymous_func_16601()
253 </pre></div>
254 </div>
255 <p>回答:</p>
256 <ul class="simple">
257 <li>これは無名関数であり、クロージャー (関数閉包) ではありません。</li>
258 <li>この世界の開発者たちがクロージャーの実装を要望しましたが、 Ring 言語の開発で新しい機能を追加することは Ring 言語の目的と精神に反することです。</li>
259 <li>関数とステートを統合したいときはクラスとオブジェクトを使うのが明確な解決方法です。</li>
260 <li>リストを使用してリストの内側に無名関数を記述すると、ステートと関数のあるリストを返せます。なお、使用時は関数へリストを渡します。</li>
261 <li>eval() および substr() を使うと、無名関数を返す前に変数の値を直接追加できます。</li>
262 <li>関数の定義時に、ほかのスコープを保護します。Ring では最大で三種類のスコープに属する各場所で、三種類のスコープ規則があります (グローバル、オブジェクトのスコープ、およびローカルスコープ)。</li>
263 <li>ほかのプログラミング言語を、全て真似をする必要もありませんし、真似しても全て得られるわけではありません! そのように考えているならば、非常に複雑怪奇なプログラミング言語を作成するか、時間を節約するために他のプログラミング言語を使うと思います。</li>
264 <li>新しいプログラミング言語の学習、または勉強に専念して (Ring の新しいところや優れたところ)、 いつから使い始めるかについて考えることがあります。数ヶ月前に、公開されたプログラミング言語と数年前に開発が始まったプログラミング言語を比較すること、および現在の世界で使用されているプログラミング言語をすべて理解したと錯覚しないでください。</li>
265 <li>各々のプログラミング言語にある理解できないことが、ほかのプログラミング言語では特徴となります。アイディアは機能でありません。すべての機能に隠された精神と才能です。</li>
266 </ul>
267 </div>
268 <div class="section" id="index-9">
269 <span id="id4"></span><h2>シンタックスの処理ではなく自作言語の定義機能があり、コードなどで構文解析の使用を可能にしている理由は?<a class="headerlink" href="#index-9" title="このヘッドラインへのパーマリンク">¶</a></h2>
270 <p>つまり、画期的です - 構文解析関連の学習をせずに、自然言語ステートメントを作成できます。
271 聡明な判断により、クラスを使用します (後でコンテキストに基づき
272 様々なステートメントへ対応するクラスを併用できるようにするためです -
273 ステートメントの変更と変換など様々なことができます)。
274 また、すべての Ring ステートメントを Ring 環境から使えるようにするステートメントを追加してあります。</p>
275 </div>
276 <div class="section" id="index-10">
277 <span id="id5"></span><h2>ループの中断時に数値の指定ができる理由は?<a class="headerlink" href="#index-10" title="このヘッドラインへのパーマリンク">¶</a></h2>
278 <p>Ring は小規模プログラミングと大規模プログラミングに対応しています。
279 目的と手段に基づいて使用する機能を選択します。
280 お望みとあれば、プログラマはプログラミング言語で粗悪なコードを記述できます。
281 このアイディアは、柔軟性破壊などの問題を起こさせないために、言語設計でエラー対策を盛り込む必要があります。</p>
282 <p>例えば、 Linux カーネルと Ruby の実装としてコードの一部を読むと、普段は使用しない一般的規則による実用的な GOTO の用法と用例を理解するでしょう。また、優れたプログラマは、いつ規則を破るべきかを知っています。
283 Ring において GOTO は使用不能であり、実装予定については一切言及しません。
284 しかし、一階層以上のループを中断する機能や下位関数からループを中断する機能は、小規模プログラムでは実用的です。</p>
285 <p>とにかく、これらは言語により追加された小さな新機能の一部です (重要なアイディアではありません)。</p>
286 </div>
287 <div class="section" id="ring-see-give-but-ok">
288 <span id="index-11"></span><h2>Ring で ‘See’, ‘Give’, ‘But’ および ‘Ok’ キーワードを採用する理由は?<a class="headerlink" href="#ring-see-give-but-ok" title="このヘッドラインへのパーマリンク">¶</a></h2>
289 <p>See と Give は “反対の動作” ではありませんが、プログラマがしたいことをするために選びました。</p>
290 <p>画面から処理の過程や結果を確認したいときは ‘See’ です。</p>
291 <p>キーボードからの標準入力をプログラムへ与えたいときは ‘Give’ です。</p>
292 <p>“but” や “ok” を選んだ根拠は簡単に書けるキーワードだからです。</p>
293 <p>また elseif/elif/elsif は文脈ごとに違うキーワードを使い分ける必要があるため &#8220;but&#8221; のほうが覚えやすいです。</p>
294 <p>これらは Ring 1.1 以降ではオプション扱いです。</p>
295 <p>‘See’ と ‘Give’ の代わりに ‘Put’ と ‘Get’ を使えます。</p>
296 <p>‘But’ と‘Ok’ の代わりに‘elseif’ または ‘end’ を使えます。</p>
297 <p>それは読者の選択にゆだねられています。 Ring には複数の記法とシンタックスの柔軟性があります。</p>
298 <p>また、自然言語の新規定義、および言語のキーワードと演算子を変更可能です。</p>
299 </div>
300 <div class="section" id="ring">
301 <span id="index-12"></span><h2>Ring においてデータ型の背景にある哲学とは?<a class="headerlink" href="#ring" title="このヘッドラインへのパーマリンク">¶</a></h2>
302 <p>Ring は開発で求められる基本概念を実装しています! 可能な限り、基本概念は単純明快・小規模を維持するのが目標の一つです。</p>
303 <p>Ring におけるリストの用法で可能なこと</p>
304 <ul class="simple">
305 <li>配列の作成 (単体データ型)</li>
306 <li>リストの作成 (混成データ型)</li>
307 <li>ツリーの作成 (入れ子による配列)</li>
308 <li>インデックスに文字列を使用 (ディクショナリー・ハッシュテーブル風の記法)</li>
309 </ul>
310 <p>同じ原則は、これらを数値に使うときにも適用されます。</p>
311 <ul class="simple">
312 <li>int 値</li>
313 <li>double 値</li>
314 <li>Boolean 値 (True/False)</li>
315 </ul>
316 <p>この事例の原則は、下記を文字列へ格納するときにも適用されます。</p>
317 <ul class="simple">
318 <li>文字</li>
319 <li>テキスト (一行以上)</li>
320 <li>バイナリデータ</li>
321 <li>日付</li>
322 <li>日時</li>
323 <li>NULL 値 (空の文字列)</li>
324 </ul>
325 <p>プログラマが新しいデータ型を定義することで、言語の定義済みデフォルト型として
326 使用できるオブジェクト指向への対応。つまり、 + 演算子のオーバーロードがあります。</p>
327 <p>よって、このようになりました。</p>
328 <ul class="simple">
329 <li>高速化のため、 Ring 言語では基本型 (文字列、数値、リスト、オブジェクト) が扱えます。</li>
330 <li>オブジェクト指向プログラミングを採用しています。アプリケーションの問題領域に従い、新しい型を追加することで拡張できる柔軟なプログラミング言語です。</li>
331 </ul>
332 </div>
333 <div class="section" id="index-13">
334 <span id="id6"></span><h2>Ring でのブール値とは?<a class="headerlink" href="#index-13" title="このヘッドラインへのパーマリンク">¶</a></h2>
335 <p>コードでブール式の結果を判定するときに</p>
336 <p>true (真) では 1 を、および false (偽) では 0 を使えます。</p>
337 <p>see 命令で値を表示するときに 1 は (true) であり、 0 は (false) を表示します。</p>
338 <p>理由は?</p>
339 <p>Ring には四種類の型があるからです。</p>
340 <ol class="arabic simple">
341 <li>数値</li>
342 <li>文字列</li>
343 <li>リスト</li>
344 <li>オブジェクト</li>
345 </ol>
346 <p>最初の型 (数値) は、 int (整数)、倍精度数、ブール値を表すために使用されます。</p>
347 <p>二番目の型 (文字列) は、 char (文字) 型、文字の配列、日付と時刻を表すために使用されます。</p>
348 <p>三番目の型 (リスト) は配列型であり、複合型から構成される配列として、ハッシュ (ディクショナリ)、ツリーなどを表すために使用されます。</p>
349 <p>オブジェクトは、 Ring のクラス (全てのクラス) または C/C++ 関数、メソッドを呼び出すことで得られる C ポインタから作成されたオブジェクトです。</p>
350 <p>なぜですか?</p>
351 <p>Ring はプログラマ、開発者が様々な作業で使えるように
352 最も単純明快な概念で設計されています。問題領域の定義に関心があるならば、
353 プログラマ、開発者は様々な型を取得するために、新しいクラス (および演算子のオーバーロード)を作成することで言語をカスタマイズします。</p>
354 <p>どうしてですか?</p>
355 <p>単純なことは良いことであり、習得と記憶が簡単だからです! さらに、これは基本型で表現可能な高水準型の間における変換の柔軟性があります。</p>
356 </div>
357 <div class="section" id="ring-main">
358 <span id="index-14"></span><h2>Ring に “Main” 関数を実装した理由は?<a class="headerlink" href="#ring-main" title="このヘッドラインへのパーマリンク">¶</a></h2>
359 <p>Main 関数は非常に重要であり、グローバルスコープの代わりにローカル変数を使用する
360 ステートメントを記述したいときに必要です。</p>
361 <p>用例:</p>
362 <div class="highlight-ring"><div class="highlight"><pre><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
363 <span class="n">myfunc</span><span class="p">()</span>
364 <span class="k">See</span> <span class="s">&quot;X value = &quot;</span> <span class="o">+</span> <span class="n">X</span>  <span class="c"># ここでは x の値は (10) と想定します。</span>
365                       <span class="c"># しかし myfunc() で x を使用しているため別の値 (6) になります!</span>
366 <span class="k">Func</span> <span class="n">myfunc</span>
367    <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">5</span>
368        <span class="k">See</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span>
369    <span class="k">next</span>
370 </pre></div>
371 </div>
372 <p>実行結果:</p>
373 <div class="highlight-ring"><div class="highlight"><pre><span class="mi">1</span>
374 <span class="mi">2</span>
375 <span class="mi">3</span>
376 <span class="mi">4</span>
377 <span class="mi">5</span>
378 <span class="n">X</span> <span class="n">value</span> <span class="o">=</span> <span class="mi">6</span>
379 </pre></div>
380 </div>
381 <p>Main 関数の使用</p>
382 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Func</span> <span class="n">Main</span>
383    <span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
384    <span class="n">myfunc</span><span class="p">()</span>
385    <span class="k">See</span> <span class="s">&quot;X value = &quot;</span> <span class="o">+</span> <span class="n">X</span>
386
387 <span class="k">Func</span> <span class="n">myfunc</span>
388    <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">5</span>
389        <span class="k">See</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span>
390    <span class="k">next</span>
391 </pre></div>
392 </div>
393 <p>実行結果:</p>
394 <div class="highlight-ring"><div class="highlight"><pre><span class="mi">1</span>
395 <span class="mi">2</span>
396 <span class="mi">3</span>
397 <span class="mi">4</span>
398 <span class="mi">5</span>
399 <span class="n">X</span> <span class="n">value</span> <span class="o">=</span> <span class="mi">10</span>
400 </pre></div>
401 </div>
402 </div>
403 <div class="section" id="ring-1">
404 <span id="index-15"></span><h2>Ring のインデックスが 1 から始まる理由は?<a class="headerlink" href="#ring-1" title="このヘッドラインへのパーマリンク">¶</a></h2>
405 <p>実生活では、三個のリンゴを手に持って数えるとき、</p>
406 <p>1 2 3 と数えます。</p>
407 <p>0 から数えることはしません。</p>
408 <p>質問: ほかのプログラミング言語において、インデックスが必ず 0 から開始されるのか?</p>
409 <p>回答: これは、計算機における値とメモリアドレスの取り扱い方法について関係があります。</p>
410 <p>用例:</p>
411 <p>myarray[5] 配列があります。</p>
412 <p>メモリには: myarray のアドレスがあります。</p>
413 <p>最初の項目は、アドレスへ格納されます。</p>
414 <p>二番目の項目は、アドレスの後などにあります。</p>
415 <p>myarray のアドレスで必要となる最初のアドレスを指し示す必要がある場合は</p>
416 <p>myarray + 0 の結果は、最初にある項目を指し示すため、そのまま myarray[0] と入力します。</p>
417 <p>myarray + 1 の結果は、二番目などにある項目を指し示すため、 myarray[1] と入力します。</p>
418 <p>このような仕組みは、低水準言語またはハードウェア寄りの言語では良いことです。</p>
419 <p>しかし、アプリケーション開発用に設計された高級言語では、違和感のない仕組みのほうが優れています。</p>
420 <p>用例:</p>
421 <div class="highlight-ring"><div class="highlight"><pre><span class="n">mylist</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="o">]</span>
422 <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="n">len</span><span class="p">(</span><span class="n">mylist</span><span class="p">)</span>
423         <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span>
424 <span class="k">next</span>
425 </pre></div>
426 </div>
427 <p>前述の用例では、配列の長さは 1 から開始します。
428 0 から開始するインデックスを記述する場合は、</p>
429 <div class="highlight-ring"><div class="highlight"><pre><span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">to</span> <span class="n">len</span><span class="p">(</span><span class="n">mylist</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span>
430 </pre></div>
431 </div>
432 <p>また、 ほかのプログラミング言語の for ループのようにする方法を覚えておいてください。</p>
433 <div class="highlight-ring"><div class="highlight"><pre><span class="k">for</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span> <span class="p">;</span> <span class="n">x</span><span class="o">&lt;</span><span class="n">nMax</span> <span class="p">;</span> <span class="n">x</span><span class="o">++</span> <span class="p">)</span>
434 </pre></div>
435 </div>
436 <p>&lt; 演算子を使用してください! (ZeroLib も使えます)</p>
437 </div>
438 <div class="section" id="index-16">
439 <span id="id7"></span><h2>Ring が英数大小文字を区別しない理由は?<a class="headerlink" href="#index-16" title="このヘッドラインへのパーマリンク">¶</a></h2>
440 <ol class="arabic simple">
441 <li>もっとひとにやさしくするため。</li>
442 <li>Ada, SQL, Pascal, Delphi, Visual Basic, Visual FoxPro に影響を受けたため。</li>
443 <li>自然言語プログラミングの対応において効果的であるため。</li>
444 <li>プログラミング言語のキーワードを記述するとき、好みの記法を選択できるようにするため。</li>
445 </ol>
446 <div class="highlight-ring"><div class="highlight"><pre><span class="k">see</span> <span class="s">&quot;lower case!&quot;</span>
447 </pre></div>
448 </div>
449 <div class="highlight-ring"><div class="highlight"><pre><span class="k">SEE</span> <span class="s">&quot;UPPER case!&quot;</span>
450 </pre></div>
451 </div>
452 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;First Letter is UPPER case!&quot;</span>
453 </pre></div>
454 </div>
455 <ol class="arabic simple" start="5">
456 <li>手軽なテストを書くために、 “Variable” ではなく “variable” を入力してしまった後にエラーメッセージになるのを防ぐため。</li>
457 <li>“dosomething()” ではなく、 “Dosomething()” を入力してしまった後にエラーメッセージになるのを防ぐため。</li>
458 <li>Ring では、変数、メソッド名、およびクラス名の間で名前衝突を起こさないため。</li>
459 </ol>
460 <p>変数名として、 person および クラス名として Person を記述できます。</p>
461 <div class="highlight-ring"><div class="highlight"><pre><span class="n">person</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span>
462 <span class="k">class</span> <span class="n">Person</span>
463         <span class="n">name</span> <span class="n">address</span> <span class="n">phone</span>
464 </pre></div>
465 </div>
466 <p>大小英数を区別したい場合は、キーワードと演算子の再定義 (またはプリプロセッサを自作)、および全角英数を使用してください。</p>
467 </div>
468 <div class="section" id="index-17">
469 <span id="id8"></span><h2>代入演算子で深いコピーを使用する理由は?<a class="headerlink" href="#index-17" title="このヘッドラインへのパーマリンク">¶</a></h2>
470 <dl class="docutils">
471 <dt>“つまり、実行性能の利得に関しては疑問と劣悪な等価交換があります。</dt>
472 <dd>第三者による証明が行われるまで、深いvs浅いコピーの良い手引きとしては深いコピーのほうが好ましいです。”
473 ― スティーブ・マコーネル、コンプリートコードより</dd>
474 </dl>
475 <ol class="arabic">
476 <li><p class="first">代入演算子では深いコピーを要求したほうが違和感がありません。</p>
477 </li>
478 <li><p class="first">深いコピーが不要ならば、使用しないだけで良いです!</p>
479 </li>
480 <li><p class="first">Ring は、できる限り参照の使用を減らすように設計しています。</p>
481 </li>
482 <li><p class="first">Ring は、これが意味がある特別な場合において、参照を単純かつ可能にするために設計されています。</p>
483 </li>
484 <li><dl class="first docutils">
485 <dt>関数へのリスト、およびオブジェクト渡すとき、 C/C++ ライブラリからオブジェクトを</dt>
486 <dd><p class="first last">作成時 (GUI オブジェクトなど)、リストの内側に格納されている
487 オブジェクトを返すときなど、これが当然である場合は参照となります。</p>
488 </dd>
489 </dl>
490 </li>
491 <li><dl class="first docutils">
492 <dt>これは機能であり、純粋関数を作成するために使えます。これが必要なとき、</dt>
493 <dd><p class="first last">stdlib の Value() 関数は、この機能で値によるリストとオブジェクトを渡します。</p>
494 </dd>
495 </dl>
496 </li>
497 <li><p class="first">参照が必要なときは、リストを共有管理するためのクラスとオブジェクトの作成を推奨します。</p>
498 </li>
499 <li><p class="first">様々なロジックエラーを回避することは、アプリケーションの水準ではより安全なことです。</p>
500 </li>
501 <li><dl class="first docutils">
502 <dt>Ring では、つまらない、細かいことに関して考えずに開発を開始してアプリケーションに専念するため、型を記述しなくても良いです (動的型付け)。</dt>
503 <dd><p class="first last">また、数値、および文字列の間で明示的変換を記述しなくても良いです (弱い型付け)。
504 さらに、値または参照、および使用の間で選択しなくても良いです。
505 そして、スコープを記述しなくても良いです (レキシカルスコープ)。</p>
506 </dd>
507 </dl>
508 </li>
509 <li><dl class="first docutils">
510 <dt>Ring には、スマートガベージコレクター (単純で高速) があります。代入演算子を使用すれば、いつでも好きなときにメモリを直接削除できます。</dt>
511 <dd><p class="first last">これは参照の削減方法、または管理プログラムから使用することは、当目的を達成するのに大いに有効です。
512 これによる完全な制御があります。</p>
513 </dd>
514 </dl>
515 </li>
516 <li><dl class="first docutils">
517 <dt>参照の作成、および管理の作成を回避したい場合は</dt>
518 <dd><p class="first last">Object2Pointer() と Pointer2Object() 関数を使用します。
519 しかし、これは Ring の “精神” に反しています。</p>
520 </dd>
521 </dl>
522 </li>
523 </ol>
524 </div>
525 <div class="section" id="index-18">
526 <span id="id9"></span><h2>Ring にコンストラクタメソッドはありますか?<a class="headerlink" href="#index-18" title="このヘッドラインへのパーマリンク">¶</a></h2>
527 <p>例えば新しいオブジェクトの作成時、</p>
528 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">point</span>
529 </pre></div>
530 </div>
531 <p>1 - Ring で認識されていないときは Ring は新しいオブジェクトの属性で用いる動的メモリ空間を割り当てます。</p>
532 <p>2 - Ring は手順①で作成されたオブジェクトのステートで現在のオブジェクトのスコープとローカルスコープを変更します。</p>
533 <p>3 - Ring は実行中に、クラスの範囲を移動します (クラス名の末尾、そしてメソッドの先頭)。</p>
534 <p>4 - クラスの範囲内にあるすべての命令やコードは、 Ring のコードとして実行されます。</p>
535 <p>5 - クラスの範囲が終端に到達、または Return 命令を使うと、制御はクラスの範囲から (新しい場所) へ移動します。</p>
536 <p>オブジェクトが追加された全属性は動的属性であるため、これは実行時に追加する属性を制御できます。</p>
537 <p>用例:</p>
538 <div class="highlight-ring"><div class="highlight"><pre>$3D = False
539 see  new point
540 $3D = True
541 see new point
542
543 class point
544         x y
545         if not $3D return ok
546         z
547 </pre></div>
548 </div>
549 <p>実行結果:</p>
550 <div class="highlight-none"><div class="highlight"><pre>x: NULL
551 y: NULL
552 x: NULL
553 y: NULL
554 z: NULL
555 </pre></div>
556 </div>
557 <p>新しいオブジェクトの作成時、 init() メソッドを直接呼び出すオプションがあります。</p>
558 <p>このメソッドはオブジェクトの作成後に、クラスの範囲にあるコードの実行すると呼び出されるため、オブジェクト属性で処理を行うことができます。</p>
559 <div class="highlight-ring"><div class="highlight"><pre><span class="n">p1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">point3d</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">200</span><span class="p">,</span><span class="mi">300</span><span class="p">)</span>
560 <span class="k">see</span> <span class="n">p1</span>
561
562 <span class="k">class</span> <span class="n">point3d</span>
563         <span class="n">x</span> <span class="n">y</span> <span class="n">z</span>
564         <span class="k">func</span> <span class="n">init</span> <span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="n">p3</span>
565                 <span class="n">x</span><span class="o">=</span><span class="n">p1</span> <span class="n">y</span><span class="o">=</span><span class="n">p2</span> <span class="n">z</span><span class="o">=</span><span class="n">p3</span>
566 </pre></div>
567 </div>
568 </div>
569 <div class="section" id="index-19">
570 <span id="id10"></span><h2>オブジェクトの新規作成時に起きていることは?<a class="headerlink" href="#index-19" title="このヘッドラインへのパーマリンク">¶</a></h2>
571 <p>1 - オブジェクトの作成時に、クラスの範囲にあるコードは実行されます。そして、この範囲にあるコードに基づいたオブジェクトの属性があります。</p>
572 <p>2 - Ring は、メソッドの呼び出しを開始するまでオブジェクトに関して気にしません。</p>
573 <p>3 - メソッドの呼び出し時に、 Ring はオブジェクトのクラスと親クラスの確認を行い (継承を使用しているならば)、同一クラスに所属する全てのオブジェクトから現在または今後使用するためにメソッドを収集します。</p>
574 <p>4 - メソッドは動的であり、各オブジェクトはクラスのメソッドから取得するため、オブジェクトの作成後に、メソッドの追加、オブジェクトまたは作成されたオブジェクトの使用、または同一クラスから作成できます。</p>
575 <p>用例:</p>
576 <div class="highlight-ring"><div class="highlight"><pre><span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">point</span> <span class="p">{</span><span class="n">x</span><span class="o">=</span><span class="mi">10</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span> <span class="n">z</span><span class="o">=</span><span class="mi">30</span><span class="p">}</span>
577 <span class="n">o2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">point</span> <span class="p">{</span><span class="n">x</span><span class="o">=</span><span class="mi">100</span> <span class="n">y</span><span class="o">=</span><span class="mi">200</span> <span class="n">z</span> <span class="o">=</span><span class="mi">300</span><span class="p">}</span>
578
579 <span class="n">addmethod</span><span class="p">(</span><span class="n">o1</span><span class="p">,</span><span class="s">&quot;print&quot;</span><span class="p">,</span> <span class="k">func</span> <span class="p">{</span> <span class="k">see</span> <span class="n">x</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">y</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">z</span> <span class="o">+</span> <span class="n">nl</span> <span class="p">}</span> <span class="p">)</span>
580
581 <span class="n">o1</span><span class="p">.</span><span class="n">print</span><span class="p">()</span>
582 <span class="n">o2</span><span class="p">.</span><span class="n">print</span><span class="p">()</span>
583
584 <span class="k">class</span> <span class="n">point</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span>
585 </pre></div>
586 </div>
587 <p>実行結果:</p>
588 <div class="highlight-none"><div class="highlight"><pre>10
589 20
590 30
591 100
592 200
593 300
594 </pre></div>
595 </div>
596 </div>
597 <div class="section" id="getter-setter">
598 <span id="index-20"></span><h2>Getter と Setter メソッドでのアクセスにより属性を使えますか?<a class="headerlink" href="#getter-setter" title="このヘッドラインへのパーマリンク">¶</a></h2>
599 <p>もちろんです。クラスの外側から属性の使用を開始するときに、 Setter/Getter メソッドは自動的に呼び出されます。
600 また、属性を使わずにメソッドを呼び出せます。読者の選択しだいです。</p>
601 <p>用例:</p>
602 <div class="highlight-ring"><div class="highlight"><pre><span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Developer</span>
603 <span class="n">o1</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Mahmoud&quot;</span>  <span class="k">see</span> <span class="n">o1</span><span class="p">.</span><span class="n">name</span> <span class="o">+</span> <span class="n">nl</span>
604 <span class="n">o1</span> <span class="p">{</span> <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Gal&quot;</span>  <span class="k">see</span> <span class="n">name</span> <span class="p">}</span>
605 <span class="n">o1</span> <span class="p">{</span> <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;Bert&quot;</span>  <span class="k">see</span> <span class="n">name</span> <span class="p">}</span>
606
607 <span class="n">o1</span><span class="p">.</span><span class="n">setname</span><span class="p">(</span><span class="s">&quot;Marino&quot;</span><span class="p">)</span>
608 <span class="k">see</span> <span class="n">o1</span><span class="p">.</span><span class="n">getname</span><span class="p">()</span>
609
610 <span class="k">Class</span> <span class="n">Developer</span>
611
612                 <span class="n">name</span> <span class="n">language</span> <span class="o">=</span> <span class="s">&quot;Ring Programming Language&quot;</span>
613
614                 <span class="k">func</span> <span class="n">setname</span> <span class="n">value</span>
615                                 <span class="k">see</span> <span class="s">&quot;Message from SetName() Function!&quot;</span> <span class="o">+</span> <span class="n">nl</span>
616                                 <span class="n">name</span> <span class="o">=</span> <span class="n">value</span> <span class="o">+</span> <span class="s">&quot; - &quot;</span> <span class="o">+</span> <span class="n">language</span>
617
618                 <span class="k">func</span> <span class="n">getname</span>
619                                 <span class="k">see</span> <span class="s">&quot;Message from GetName() Function!&quot;</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span> <span class="n">nl</span>
620                                 <span class="k">return</span> <span class="s">&quot;Mr. &quot;</span> <span class="o">+</span> <span class="n">name</span> <span class="o">+</span> <span class="n">nl</span>
621 </pre></div>
622 </div>
623 <p>実行結果:</p>
624 <div class="highlight-none"><div class="highlight"><pre>Message from SetName() Function!
625 Message from GetName() Function!
626
627 Mr. Mahmoud - Ring Programming Language
628
629 Message from SetName() Function!
630 Message from GetName() Function!
631
632 Mr. Gal - Ring Programming Language
633 Message from SetName() Function!
634 Message from GetName() Function!
635
636 Mr. Bert - Ring Programming Language
637 Message from SetName() Function!
638 Message from GetName() Function!
639
640 Mr. Marino - Ring Programming Language
641 </pre></div>
642 </div>
643 </div>
644 <div class="section" id="index-21">
645 <span id="id11"></span><h2>クラスを定義している間にグローバルな名前の検索を行う理由は?<a class="headerlink" href="#index-21" title="このヘッドラインへのパーマリンク">¶</a></h2>
646 <p>質問は、なぜクラス属性の定義時に
647 グローバル変数との名前衝突を回避しないのですか?</p>
648 <p>先頭にオプションの $ 記号で、グローバル変数名の問題解決になることを覚えておいてください。
649 Main 関数は、グローバル変数を避けるために効果があります。</p>
650 <p>回答:</p>
651 <p>Ring は動的プログラミング言語です。</p>
652 <p>実行時に、クラスの属性を決定できます (追加・削除)。</p>
653 <p>クラスの属性を定義している間は、実行 (指定のコード) できます。</p>
654 <p>用例①</p>
655 <div class="highlight-ring"><div class="highlight"><pre><span class="n">oPerson</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span>
656 <span class="k">Class</span> <span class="n">Person</span>
657    <span class="k">See</span> <span class="s">&quot;Welcome to the Ring language&quot;</span>
658 </pre></div>
659 </div>
660 <p>用例②</p>
661 <p>グローバル変数に基づき、属性をカスタマイズします。</p>
662 <div class="highlight-ring"><div class="highlight"><pre><span class="o">$</span><span class="n">debug</span> <span class="o">=</span> <span class="kp">true</span>
663 <span class="n">oPerson</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span>
664 <span class="k">see</span> <span class="n">oPerson</span>
665 <span class="k">Class</span> <span class="n">Person</span>
666     <span class="k">if</span> <span class="o">$</span><span class="n">debug</span>  <span class="n">date</span><span class="o">=</span><span class="n">date</span><span class="p">()</span>  <span class="n">time</span><span class="o">=</span><span class="n">time</span><span class="p">()</span> <span class="k">ok</span>
667 </pre></div>
668 </div>
669 <p>前述の用例では、 $debug フラグに true が設定されているとき、
670 オブジェクトのステートへ Date と Time 属性を追加します。</p>
671 <p>用例③</p>
672 <p>グローバル変数に基づき、オブジェクトのインデックスを格納します。</p>
673 <div class="highlight-ring"><div class="highlight"><pre><span class="o">$</span><span class="n">ObjectsCount</span> <span class="o">=</span> <span class="mi">0</span>
674 <span class="n">oPerson</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span>
675 <span class="k">see</span> <span class="n">oPerson</span>
676 <span class="n">oPerson2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span>
677 <span class="k">see</span> <span class="n">oPerson2</span>
678 <span class="k">Class</span> <span class="n">Person</span>
679       <span class="o">$</span><span class="n">ObjectsCount</span><span class="o">++</span>
680       <span class="n">nIndex</span> <span class="o">=</span> <span class="o">$</span><span class="n">ObjectsCount</span>
681 </pre></div>
682 </div>
683 <p>実行結果:</p>
684 <div class="highlight-ring"><div class="highlight"><pre><span class="n">nindex</span><span class="p">:</span> <span class="mf">1.000000</span>
685 <span class="n">nindex</span><span class="p">:</span> <span class="mf">2.000000</span>
686 </pre></div>
687 </div>
688 <p>一般的な用例:</p>
689 <ul class="simple">
690 <li>データベースの接続後に、デーブルのカラムを取得します (グローバル変数やオブジェクトを使用)。</li>
691 <li>カラム名に基づき、クラスの属性を作成します。</li>
692 <li>後でデータベースを修正します - 不要ならば、コードを修正しないでください。</li>
693 </ul>
694 <p>柔軟性はありますが、すばらしい応答性による強力さがあることを覚えておいてください。</p>
695 </div>
696 <div class="section" id="index-22">
697 <span id="id12"></span><h2>Ring でグローバル変数とクラスの属性名間の名前衝突を回避しない理由は?<a class="headerlink" href="#index-22" title="このヘッドラインへのパーマリンク">¶</a></h2>
698 <p>このような場合の対応策です。</p>
699 <p>1 - $ などの特殊記号を使用せずに、グローバル変数を定義するためです。</p>
700 <p>2 - クラスには、特別なシンタックスで定義された属性があります (クラスの後に属性名を直接入力します)。</p>
701 <p>3 - 属性は、コードの記述とグローバル変数の使用が許されているクラスの範囲で定義されます。</p>
702 <p>クラスの範囲内で、 Ring の変数検出方法の変更について提案を受け入れる場合は、この問題よりも更に重要な問題を多発する前に三つの機能のうち一つを破る必要があります。</p>
703 <p>Ring のコードをもっと綺麗なものにしておきたいし、 $ を使用する・しないときをプログラマに決定させたいため機能番号①の変更は好ましくありません。</p>
704 <p>この機能は気に入っており、プログラマに Self.属性 の入力を強制するのは好みではないので機能番号②の変更は好ましくありません。</p>
705 <p>ほとんどのアプリケーションでは、クラスの範囲内でのグローバル変数へのアクセスは非常に重要であるため機能番号③の変更は好ましくありません。</p>
706 <p>判断理由は?</p>
707 <p>筆者は、この特例を回避するかどうかをプログラマが決めるために、この事例を記載することにしました。</p>
708 <p>1 - グローバル変数の使用を回避でき (最良)、 Main 関数 (オプション扱い) を使えます。</p>
709 <p>2 - プログラマは変数名の先頭に <code class="docutils literal"><span class="pre">$</span></code> あるいは <code class="docutils literal"><span class="pre">global_</span></code> または <code class="docutils literal"><span class="pre">g_</span></code> などの記号を使えます。</p>
710 <p>3 - プログラマは属性を定義するために、クラス名末尾に Self.属性 を使えます。</p>
711 <p>一般に、小規模プログラムではグローバル変数と関数を使います。大規模プログラムではクラスとオブジェクトを使いますので、グローバル変数は数本だけに絞るか、または使わないでください。</p>
712 </div>
713 <div class="section" id="ftell-fseek">
714 <span id="index-23"></span><h2>ftell() と fseek() でファイルの大きさを取得するには?<a class="headerlink" href="#ftell-fseek" title="このヘッドラインへのパーマリンク">¶</a></h2>
715 <p>この関数はファイルの読み込みを行わずに、ファイルの大きさを取得します!</p>
716 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">getFileSize</span> <span class="n">fp</span>
717        <span class="n">C_FILESTART</span> <span class="o">=</span> <span class="mi">0</span>
718        <span class="n">C_FILEEND</span> <span class="o">=</span> <span class="mi">2</span>
719        <span class="n">fseek</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="n">C_FILEEND</span><span class="p">)</span>
720        <span class="n">nFileSize</span> <span class="o">=</span> <span class="n">ftell</span><span class="p">(</span><span class="n">fp</span><span class="p">)</span>
721        <span class="n">fseek</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="n">C_FILESTART</span><span class="p">)</span>
722        <span class="k">return</span> <span class="n">nFileSize</span>
723 </pre></div>
724 </div>
725 <div class="admonition note">
726 <p class="first admonition-title">注釈</p>
727 <p class="last">前述の関数では仮引数として、 fp (ファイルポインタ) を扱います。 fopen() 関数で開いているファイルから fp を取得できます。</p>
728 </div>
729 <div class="highlight-ring"><div class="highlight"><pre><span class="n">fp</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="s">&quot;filename&quot;</span><span class="p">,</span><span class="s">&quot;r&quot;</span><span class="p">)</span>
730
731 <span class="k">see</span>  <span class="s">&quot;File Size : &quot;</span> <span class="o">+</span> <span class="n">getFileSize</span><span class="p">(</span><span class="n">fp</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span>
732 </pre></div>
733 </div>
734 <p>別の解決方法 (ファイルの読み取り):</p>
735 <div class="highlight-ring"><div class="highlight"><pre><span class="k">see</span> <span class="n">len</span><span class="p">(</span><span class="n">read</span><span class="p">(</span><span class="s">&quot;filename&quot;</span><span class="p">))</span>
736 </pre></div>
737 </div>
738 </div>
739 <div class="section" id="index-24">
740 <span id="id13"></span><h2>現在のソースファイルのパスを取得するには?<a class="headerlink" href="#index-24" title="このヘッドラインへのパーマリンク">¶</a></h2>
741 <p>この関数で、現在のソースファイルのパスを取得します。
742 そして、パスを扱うための変数へファイル名を追加できます。</p>
743 <div class="highlight-ring"><div class="highlight"><pre><span class="n">cPath</span> <span class="o">=</span> <span class="n">CurrentPath</span><span class="p">()</span>
744 <span class="k">func</span> <span class="n">currentpath</span>
745         <span class="n">cFileName</span> <span class="o">=</span> <span class="n">filename</span><span class="p">()</span>
746         <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="n">len</span><span class="p">(</span><span class="n">cFileName</span><span class="p">)</span> <span class="k">to</span> <span class="mi">1</span> <span class="k">step</span> <span class="o">-</span><span class="mi">1</span>
747                 <span class="k">if</span> <span class="n">cFileName</span><span class="o">[</span><span class="n">x</span><span class="o">]</span> <span class="o">=</span> <span class="s">&quot;/&quot;</span>
748                         <span class="k">return</span> <span class="n">left</span><span class="p">(</span><span class="n">cFileName</span><span class="p">,</span><span class="n">x</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
749                 <span class="k">ok</span>
750         <span class="k">next</span>
751         <span class="k">return</span> <span class="n">cFileName</span>
752 </pre></div>
753 </div>
754 </div>
755 <div class="section" id="index-25">
756 <span id="id14"></span><h2>関数の定義済み仮引数またはオプションの仮引数とは?<a class="headerlink" href="#index-25" title="このヘッドラインへのパーマリンク">¶</a></h2>
757 <p>定義済み仮引数、またはオプションの仮引数を使用したい場合は、ハッシュ、ディクショナリなどのリストを受け入れてください。</p>
758 <p>用例:</p>
759 <div class="highlight-ring"><div class="highlight"><pre><span class="n">sum</span><span class="p">(</span><span class="o">[</span> <span class="p">:</span><span class="n">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:</span><span class="n">b</span> <span class="o">=</span> <span class="mi">2</span><span class="o">]</span><span class="p">)</span>
760 <span class="n">sum</span><span class="p">(</span><span class="o">[</span> <span class="p">:</span><span class="n">a</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">]</span><span class="p">)</span>
761 <span class="n">sum</span><span class="p">(</span><span class="o">[</span> <span class="p">:</span><span class="n">b</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">]</span><span class="p">)</span>
762 <span class="k">func</span> <span class="n">sum</span> <span class="n">pList</span>
763         <span class="k">if</span> <span class="n">plist</span><span class="o">[</span><span class="p">:</span><span class="n">a</span><span class="o">]</span> <span class="o">=</span> <span class="kp">NULL</span> <span class="n">pList</span><span class="o">[</span><span class="p">:</span><span class="n">a</span><span class="o">]</span> <span class="o">=</span> <span class="mi">4</span> <span class="k">ok</span>
764         <span class="k">if</span> <span class="n">plist</span><span class="o">[</span><span class="p">:</span><span class="n">b</span><span class="o">]</span> <span class="o">=</span> <span class="kp">NULL</span> <span class="n">pList</span><span class="o">[</span><span class="p">:</span><span class="n">b</span><span class="o">]</span> <span class="o">=</span> <span class="mi">5</span> <span class="k">ok</span>
765         <span class="k">see</span> <span class="n">pList</span><span class="o">[</span><span class="p">:</span><span class="n">a</span><span class="o">]</span> <span class="o">+</span> <span class="n">pList</span><span class="o">[</span><span class="p">:</span><span class="n">b</span><span class="o">]</span> <span class="o">+</span> <span class="n">nl</span>
766 </pre></div>
767 </div>
768 <p>実行結果:</p>
769 <div class="highlight-none"><div class="highlight"><pre>3
770 6
771 6
772 </pre></div>
773 </div>
774 </div>
775 <div class="section" id="index-26">
776 <span id="id15"></span><h2>リストやディクショナリでキーまたは値のみを表示するには?<a class="headerlink" href="#index-26" title="このヘッドラインへのパーマリンク">¶</a></h2>
777 <p>キーまたは値のみを表示したい場合は、項目のインデックスを選択します (1 または 2)。</p>
778 <p>用例</p>
779 <div class="highlight-ring"><div class="highlight"><pre><span class="n">C_COUNTRY</span> <span class="o">=</span> <span class="mi">1</span>
780 <span class="n">C_CITY</span> <span class="o">=</span> <span class="mi">2</span>
781 <span class="n">mylist</span> <span class="o">=</span> <span class="o">[</span>
782         <span class="p">:</span><span class="n">KSA</span> <span class="o">=</span> <span class="s">&quot;Riyadh&quot;</span> <span class="p">,</span>
783         <span class="p">:</span><span class="n">Egypt</span> <span class="o">=</span> <span class="s">&quot;Cairo&quot;</span>
784 <span class="o">]</span>
785
786 <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">mylist</span>
787         <span class="k">see</span> <span class="n">x</span><span class="o">[</span><span class="n">C_COUNTRY</span><span class="o">]</span> <span class="o">+</span> <span class="n">nl</span>
788 <span class="k">next</span>
789
790 <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">mylist</span>
791         <span class="k">see</span> <span class="n">x</span><span class="o">[</span><span class="n">C_CITY</span><span class="o">]</span> <span class="o">+</span> <span class="n">nl</span>
792 <span class="k">next</span>
793 </pre></div>
794 </div>
795 <p>実行結果:</p>
796 <div class="highlight-none"><div class="highlight"><pre>ksa
797 egypt
798 Riyadh
799 Cairo
800 </pre></div>
801 </div>
802 </div>
803 <div class="section" id="nl">
804 <span id="index-27"></span><h2>リストで nl を表示するときに変な結果になる理由は?<a class="headerlink" href="#nl" title="このヘッドラインへのパーマリンク">¶</a></h2>
805 <p>このコードでは、</p>
806 <div class="highlight-ring"><div class="highlight"><pre><span class="kt">list</span> <span class="o">=</span> <span class="mi">1</span><span class="p">:</span><span class="mi">5</span>        <span class="c"># list = [1,2,3,4,5]</span>
807 <span class="k">see</span> <span class="kt">list</span> <span class="o">+</span> <span class="n">nl</span>
808 </pre></div>
809 </div>
810 <p>リストへ改行を追加後にリストを表示します。つまり、通常のリスト表示では、リストの末尾にある改行も表示します。
811 新しい改行文字を追加したので、改行は二行表示となります。</p>
812 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="o">&lt;</span><span class="n">式</span><span class="o">&gt;</span>
813 </pre></div>
814 </div>
815 <p>see 命令は式の最終結果を表示するため、このように式が評価されます。</p>
816 <div class="highlight-ring"><div class="highlight"><pre><span class="n">nl</span> <span class="o">=</span> <span class="n">char</span><span class="p">(</span><span class="mi">13</span><span class="p">)</span> <span class="o">+</span> <span class="n">char</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="c"># 変更可能な変数!</span>
817 </pre></div>
818 </div>
819 <p>+ は演算子です。</p>
820 <div class="highlight-none"><div class="highlight"><pre>文字列 + 文字列 ---&gt; 新しい文字列
821 文字列 + 数値   ---&gt; 新しい文字列
822 数値   + 数値   ---&gt; 新しい数値
823 数値   + 文字列 ---&gt; 新しい数値
824 </pre></div>
825 </div>
826 <p>リスト + 項目 &#8212;&gt; なにも新規作成されませんが、同じリストへ項目が追加されます。</p>
827 <p>例外:</p>
828 <p>数値 + nl &#8212;&gt; 新しい文字列</p>
829 <p>この例外は数値の表示後に、改行を簡単にできるよう追加されています。</p>
830 <p>最後の項目を表示した後には、改行が既にあるため、これはリストを表示するためには不要です。</p>
831 </div>
832 <div class="section" id="strcmp">
833 <span id="index-28"></span><h2>StrCmp() の実行結果について解説していただけますか?<a class="headerlink" href="#strcmp" title="このヘッドラインへのパーマリンク">¶</a></h2>
834 <p>まず、 ‘=’ 演算子で直接的に文字列を検査できることを覚えておいてください。</p>
835 <div class="highlight-ring"><div class="highlight"><pre><span class="k">see</span> <span class="n">strcmp</span><span class="p">(</span><span class="s">&quot;hello&quot;</span><span class="p">,</span><span class="s">&quot;hello&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>
836 <span class="n">strcmp</span><span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="p">,</span><span class="s">&quot;bcd&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>
837 <span class="n">strcmp</span><span class="p">(</span><span class="s">&quot;bcd&quot;</span><span class="p">,</span><span class="s">&quot;abc&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span>
838 </pre></div>
839 </div>
840 <p>両方とも、同じ文字列の場合は 0 を返します。</p>
841 <p>abc と bcd は違います。二行目は -1 を返しており三行目は 1 を返します。</p>
842 <p>二行目では “abc” と “bcd” の比較を行っています。</p>
843 <p>“abc” = “a” の一文字目と “bcd” = “b” の一文字は等しくありません。
844 よって “a” != “b” と “a” &lt; “b” の結果となります。</p>
845 <p>よって “a” != “b” と “a” &lt; “b” の</p>
846 <p>実行結果は -1 となります。</p>
847 <p>三行目には “bcd” と “abc” があります。</p>
848 <p>“bcd” の一文字目は “b” であり “abc” の一文字は= “a” です。</p>
849 <p>結果は “b” != “a” と “b” &gt; “a” です。</p>
850 <p>従って、実行結果は 1 となります。</p>
851 <div class="admonition note">
852 <p class="first admonition-title">注釈</p>
853 <p class="last">ASCII(“a”) は 97 であり ASCII(“b”) は 98 です。よって 97 &lt; 98 であるため “a” は “b” 以下となります。</p>
854 </div>
855 </div>
856 <div class="section" id="index-29">
857 <span id="id16"></span><h2>プロジェクトで複数のソースコードを使うには?<a class="headerlink" href="#index-29" title="このヘッドラインへのパーマリンク">¶</a></h2>
858 <p>用例:</p>
859 <p>このようなフォルダがあります。</p>
860 <div class="highlight-none"><div class="highlight"><pre>C:\LRing
861 </pre></div>
862 </div>
863 <p>このようなファイルがフォルダにあります。</p>
864 <div class="highlight-none"><div class="highlight"><pre>C:\LRing\t1.ring
865 C:\LRing\mylib.ring
866 C:\LRing\libs\mylib2.ring
867 </pre></div>
868 </div>
869 <p>このようなコードが t1.ring ファイルにあります。</p>
870 <div class="highlight-ring"><div class="highlight"><pre><span class="k">load</span> <span class="s">&quot;mylib.ring&quot;</span>
871 <span class="k">load</span> <span class="s">&quot;libs\mylib2.ring&quot;</span>
872 <span class="n">myfunc</span><span class="p">()</span>
873 <span class="n">test</span><span class="p">()</span>
874 </pre></div>
875 </div>
876 <p>このようなコードが mylib.ring ファイルにあります。</p>
877 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">myfunc</span>
878         <span class="k">see</span> <span class="s">&quot;message from myfunc&quot;</span><span class="o">+</span><span class="n">nl</span>
879 </pre></div>
880 </div>
881 <p>このようなコードが libsmylib2.ring ファイルにあります。</p>
882 <div class="highlight-ring"><div class="highlight"><pre><span class="k">func</span> <span class="n">test</span>
883         <span class="k">see</span> <span class="s">&quot;message from test&quot;</span> <span class="o">+</span> <span class="n">nl</span>
884 </pre></div>
885 </div>
886 <p>C:\LRing フォルダから。</p>
887 <p>Ring のパスを追加していない場合は、このコマンドで追加できます。</p>
888 <div class="highlight-none"><div class="highlight"><pre>set path=%path%;c:\ring\bin;
889 </pre></div>
890 </div>
891 <p>Ring フォルダ C:\Ring のある場所で</p>
892 <p>実行します。</p>
893 <div class="highlight-none"><div class="highlight"><pre>Ring t1.ring
894 </pre></div>
895 </div>
896 <p>実行結果:</p>
897 <div class="highlight-none"><div class="highlight"><pre>message from myfunc
898 message from test
899 </pre></div>
900 </div>
901 </div>
902 <div class="section" id="getchar">
903 <span id="index-30"></span><h2>この用例で GetChar() を二度使用する理由は?<a class="headerlink" href="#getchar" title="このヘッドラインへのパーマリンク">¶</a></h2>
904 <p>GetChar() 関数は、キーボードバッファから一文字受け取ります。</p>
905 <p>この用例では、</p>
906 <div class="highlight-ring"><div class="highlight"><pre><span class="k">While</span> <span class="kp">True</span>
907         <span class="k">See</span> <span class="s">&quot;</span>
908                 <span class="n">Main</span> <span class="n">Menu</span>
909                 <span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="n">Say</span> <span class="n">Hello</span>
910                 <span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="k">Exit</span>
911         <span class="s">&quot;</span>
912         <span class="n">Option</span> <span class="o">=</span> <span class="n">GetChar</span><span class="p">()</span>
913         <span class="n">GetChar</span><span class="p">()</span> <span class="n">GetChar</span><span class="p">()</span>  <span class="c"># 行の終わり</span>
914         <span class="c"># この行で前述の二行を置換できます。</span>
915         <span class="c"># Give Option</span>
916
917         <span class="k">if</span> <span class="n">Option</span> <span class="o">=</span> <span class="mi">1</span>
918                 <span class="k">see</span> <span class="s">&quot;Enter your name : &quot;</span> <span class="k">give</span> <span class="n">cName</span>
919                 <span class="k">see</span> <span class="s">&quot;Hello &quot;</span> <span class="o">+</span> <span class="n">cName</span>
920         <span class="k">else</span>
921                 <span class="k">bye</span>
922         <span class="k">ok</span>
923 <span class="k">End</span>
924 </pre></div>
925 </div>
926 <p>GetChar() を三回使用しています。</p>
927 <p>最初はユーザの選択肢を取得するときに、</p>
928 <div class="highlight-ring"><div class="highlight"><pre><span class="n">Option</span> <span class="o">=</span> <span class="n">GetChar</span><span class="p">()</span>
929 </pre></div>
930 </div>
931 <p>しかし、二回目と三回目があります (バッファから改行文字を受け取ります)。</p>
932 <div class="highlight-ring"><div class="highlight"><pre><span class="n">GetChar</span><span class="p">()</span> <span class="n">GetChar</span><span class="p">()</span>  <span class="c"># 行の終わり</span>
933 </pre></div>
934 </div>
935 <p>用例: ユーザが選択肢から 1 を選んだ後に ENTER を押します。</p>
936 <p>ここでは、三文字あります。</p>
937 <ul class="simple">
938 <li>一文字目は : 数字の 1 です。</li>
939 <li>二文字目は : CHAR(13) です。</li>
940 <li>三文字目は : CHAR(10) です。</li>
941 </ul>
942 <p>Windows において、 CHAR(13) および CHAR(10) は、それぞれ改行となります (すなわち CR+LF)。</p>
943 </div>
944 <div class="section" id="null-isnull">
945 <span id="index-31"></span><h2>NULL と isNULL() 関数の用法は?<a class="headerlink" href="#null-isnull" title="このヘッドラインへのパーマリンク">¶</a></h2>
946 <p>Ring では、未初期化変数を使うと、明示的なランタイムエラーメッセージが表示されます。</p>
947 <p>用例:</p>
948 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="n">x</span>
949 </pre></div>
950 </div>
951 <p>実行結果:</p>
952 <div class="highlight-none"><div class="highlight"><pre>Line 1 Error (R24) : Using uninitialized variable : x
953 in file tests\seeuninit.ring
954 </pre></div>
955 </div>
956 <p>未初期化の属性へアクセスすると、同じことが起こります。</p>
957 <p>用例:</p>
958 <div class="highlight-ring"><div class="highlight"><pre><span class="n">o1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">point</span>
959 <span class="k">see</span> <span class="n">o1</span>
960 <span class="k">see</span> <span class="n">o1</span><span class="p">.</span><span class="n">x</span>
961 <span class="k">class</span> <span class="n">point</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span>
962 </pre></div>
963 </div>
964 <p>実行結果</p>
965 <div class="highlight-none"><div class="highlight"><pre>x: NULL
966 y: NULL
967 z: NULL
968
969 Line 3 Error (R24) : Using uninitialized variable : x
970 in file tests\seeuninit2.ring
971 </pre></div>
972 </div>
973 <p>エラーを検査したい場合は、 Try/Catch/End を使用してください。</p>
974 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Try</span>
975         <span class="k">see</span> <span class="n">x</span>
976 <span class="k">Catch</span>
977         <span class="k">See</span> <span class="s">&quot;Sorry, We can&#39;t use x!&quot;</span> <span class="o">+</span> <span class="n">nl</span>
978 <span class="k">Done</span>
979 </pre></div>
980 </div>
981 <p>実行結果:</p>
982 <div class="highlight-none"><div class="highlight"><pre>Sorry, We can&#39;t use x!
983 </pre></div>
984 </div>
985 <p>さて、 NULL と isNULL() についてお話します。</p>
986 <p>未初期化の変数を扱おうとしたとき、エラーメッセージが出ます。</p>
987 <p>これらのエラーは Try/Catch/Done で検査できます。文字列で扱うためには NULL と isNULL() を使用します。</p>
988 <p>NULL には、空文字列の変数があります。</p>
989 <p>isNULL() は関数であり、入力が空の文字列、または文字列の内容が “NULL” ならば true (1) を返します。</p>
990 <p>これらの値 (空の文字列) をテストする必要があり、 DBMS などの外部リソースから “NULL” を有する文字列が入力されることがあるからです。</p>
991 <p>用例:</p>
992 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="n">isNULL</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>        <span class="c"># 0 の表示</span>
993 <span class="n">isNULL</span><span class="p">(</span><span class="s">&quot;hello&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>      <span class="c"># 0 の表示</span>
994 <span class="n">isNULL</span><span class="p">(</span><span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="o">]</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>      <span class="c"># 0 の表示</span>
995 <span class="n">isNULL</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>           <span class="c"># 1 の表示</span>
996 <span class="n">isNULL</span><span class="p">(</span><span class="s">&quot;NULL&quot;</span><span class="p">)</span>              <span class="c"># 1 の表示</span>
997 </pre></div>
998 </div>
999 </div>
1000 <div class="section" id="index-32">
1001 <span id="id17"></span><h2>オブジェクトのあるリストを表示するには?<a class="headerlink" href="#index-32" title="このヘッドラインへのパーマリンク">¶</a></h2>
1002 <p>この用例では、オブジェクトのあるリストの表示方法を確認します。</p>
1003 <div class="highlight-ring"><div class="highlight"><pre><span class="n">aList</span> <span class="o">=</span> <span class="o">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="o">]</span> <span class="p">,</span> <span class="k">new</span> <span class="n">point</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="k">new</span> <span class="n">point</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span><span class="o">]</span>
1004 <span class="k">see</span> <span class="s">&quot;print the list&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1005 <span class="k">see</span> <span class="n">alist</span>
1006 <span class="k">see</span> <span class="s">&quot;print the item (object)&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1007 <span class="k">see</span> <span class="n">alist</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span>
1008 <span class="k">class</span> <span class="n">point</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span>
1009         <span class="k">func</span> <span class="n">init</span> <span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="n">p3</span> <span class="n">x</span><span class="o">=</span><span class="n">p1</span> <span class="n">y</span><span class="o">=</span><span class="n">p2</span> <span class="n">z</span><span class="o">=</span><span class="n">p3</span>
1010 </pre></div>
1011 </div>
1012 <p>実行結果:</p>
1013 <div class="highlight-none"><div class="highlight"><pre>print the list
1014 1
1015 2
1016 3
1017 x: 1.000000
1018 y: 2.000000
1019 z: 3.000000
1020 x: 1.000000
1021 y: 2.000000
1022 z: 3.000000
1023 print the item (object)
1024 x: 1.000000
1025 y: 2.000000
1026 z: 3.000000
1027 </pre></div>
1028 </div>
1029 </div>
1030 <div class="section" id="index-33">
1031 <span id="id18"></span><h2>改行と文字を表示するには?<a class="headerlink" href="#index-33" title="このヘッドラインへのパーマリンク">¶</a></h2>
1032 <p>nl 変数で改行します。</p>
1033 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;Hello&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1034 </pre></div>
1035 </div>
1036 <p>複数行リテラルでも改行します。</p>
1037 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;Hello</span>
1038
1039 <span class="s">&quot;</span>
1040 </pre></div>
1041 </div>
1042 <p>char(nASCII) 関数で他の文字を表示します。</p>
1043 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="n">char</span><span class="p">(</span><span class="mi">109</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span> <span class="o">+</span>    <span class="c"># m の表示</span>
1044     <span class="n">char</span><span class="p">(</span><span class="mi">77</span><span class="p">)</span>            <span class="c"># M の表示</span>
1045 </pre></div>
1046 </div>
1047 </div>
1048 <div class="section" id="qapp">
1049 <span id="index-34"></span><h2>qApp クラス名末尾に () を使用しない理由は?<a class="headerlink" href="#qapp" title="このヘッドラインへのパーマリンク">¶</a></h2>
1050 <p>RingQt で GUI を作成する場合は、新しいオブジェクトの作成時にクラス名末尾に () を使用します。例えば、</p>
1051 <div class="highlight-ring"><div class="highlight"><pre><span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span> <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&quot;Hello World&quot;</span><span class="p">)</span> <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">show</span><span class="p">()</span> <span class="p">}</span>
1052 </pre></div>
1053 </div>
1054 <p>この処理の前に、 qApp クラスからオブジェクトを作成しますが、名前の後ろには () を使用しません。</p>
1055 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">&quot;guilib.ring&quot;</span>
1056 <span class="n">app</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qApp</span>
1057 <span class="p">{</span>
1058     <span class="n">win</span><span class="o">=</span><span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span>
1059     <span class="p">{</span>
1060         <span class="n">setwindowtitle</span><span class="p">(:</span><span class="n">test</span><span class="p">)</span>
1061         <span class="n">show</span><span class="p">()</span>
1062     <span class="p">}</span>
1063     <span class="n">exec</span><span class="p">()</span>
1064 <span class="p">}</span>
1065 </pre></div>
1066 </div>
1067 <p>クラス名末尾に () を使うと、クラス内にある init() メソッドの呼び出し、およびこのメソッドへの仮引数を渡す意味になります。</p>
1068 <p>クラス内に init() がないメソッドで () を使うと、例外エラーメッセージになります。</p>
1069 <p>そのほかのクラスには、 init() メソッドはありますが qApp クラスにはありません。
1070 関数を使用したオブジェクトのポインタを返すオブジェクトの作成に必要であり、
1071 このポインタは pObject 属性に格納されるのが理由です。
1072 詳細情報は ring_qt.ring ファイルに収録されているクラスを参照してください。</p>
1073 </div>
1074 <div class="section" id="index-35">
1075 <span id="id19"></span><h2>ウィンドウのタイトルバーが画面外に移動してしまう原因は?<a class="headerlink" href="#index-35" title="このヘッドラインへのパーマリンク">¶</a></h2>
1076 <p>このコードを記述した場合、</p>
1077 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">&quot;guilib.ring&quot;</span>
1078 <span class="n">app</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qApp</span>
1079 <span class="p">{</span>
1080         <span class="n">win</span><span class="o">=</span><span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span>
1081         <span class="p">{</span>
1082               <span class="n">setwindowtitle</span><span class="p">(:</span><span class="n">test</span><span class="p">)</span>
1083               <span class="n">setGeometry</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">200</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span>
1084               <span class="n">show</span><span class="p">()</span>
1085         <span class="p">}</span>
1086         <span class="n">exec</span><span class="p">()</span>
1087 <span class="p">}</span>
1088 </pre></div>
1089 </div>
1090 <p>ウィンドウが (200,200) の寸法で (0,0) の地点へ移動すると思うでしょう。
1091 実際は、ウィンドウのタイトルバーが画面外に移動してしまいます。</p>
1092 <p>これは Qt フレームワークの挙動と関連があります。</p>
1093 <p>このコードで問題を回避します。</p>
1094 <div class="highlight-ring"><div class="highlight"><pre><span class="k">load</span> <span class="s">&quot;guilib.ring&quot;</span>
1095 <span class="k">new</span> <span class="n">qApp</span> <span class="p">{</span>
1096         <span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span>
1097                 <span class="n">move</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
1098                 <span class="n">resize</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span>
1099                 <span class="n">show</span><span class="p">()</span>
1100         <span class="p">}</span>
1101         <span class="n">exec</span><span class="p">()</span>
1102 <span class="p">}</span>
1103 </pre></div>
1104 </div>
1105 </div>
1106 <div class="section" id="gui">
1107 <span id="index-36"></span><h2>GUI アプリケーションでボタンの配列を作成するには?<a class="headerlink" href="#gui" title="このヘッドラインへのパーマリンク">¶</a></h2>
1108 <p>この用例をご確認ください:</p>
1109 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">&quot;guilib.ring&quot;</span>
1110
1111 <span class="n">App1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qApp</span> <span class="p">{</span>
1112
1113         <span class="n">win1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qWidget</span><span class="p">()</span> <span class="p">{</span>
1114                 <span class="n">move</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
1115                 <span class="n">resize</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span><span class="mi">500</span><span class="p">)</span>
1116                 <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span>
1117                 <span class="p">{</span>
1118                         <span class="n">settext</span><span class="p">(</span><span class="s">&quot;OK&quot;</span><span class="p">)</span>
1119                         <span class="n">setclickevent</span><span class="p">(</span><span class="s">&quot;click()&quot;</span><span class="p">)</span>
1120                 <span class="p">}</span>
1121                 <span class="n">btn1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span>
1122                 <span class="p">{</span>
1123                         <span class="n">setgeometry</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
1124                         <span class="n">settext</span><span class="p">(</span><span class="s">&quot;Button1&quot;</span><span class="p">)</span>
1125                 <span class="p">}</span>
1126
1127                 <span class="n">btn2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span>
1128                 <span class="p">{</span>
1129                         <span class="n">setgeometry</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
1130                         <span class="n">settext</span><span class="p">(</span><span class="s">&quot;Button2&quot;</span><span class="p">)</span>
1131                 <span class="p">}</span>
1132
1133                 <span class="n">button</span> <span class="o">=</span> <span class="o">[</span><span class="n">btn1</span><span class="p">,</span> <span class="n">btn2</span><span class="o">]</span>
1134                 <span class="n">show</span><span class="p">()</span>
1135         <span class="p">}</span>
1136
1137         <span class="n">exec</span><span class="p">()</span>
1138
1139 <span class="p">}</span>
1140
1141 <span class="k">func</span> <span class="n">click</span>
1142
1143         <span class="n">button</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="p">{</span> <span class="n">settext</span> <span class="p">(</span><span class="s">&quot;Button3&quot;</span><span class="p">)</span> <span class="p">}</span>
1144         <span class="n">button</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="p">{</span> <span class="n">settext</span> <span class="p">(</span><span class="s">&quot;Button4&quot;</span><span class="p">)</span> <span class="p">}</span>
1145 </pre></div>
1146 </div>
1147 </div>
1148 <div class="section" id="index-37">
1149 <span id="id20"></span><h2>ウィンドウを閉じた後に別のウィンドウを表示するには?<a class="headerlink" href="#index-37" title="このヘッドラインへのパーマリンク">¶</a></h2>
1150 <p>この用例は、ウィンドウを閉じる方法と別のウィンドウを表示する方法です。</p>
1151 <div class="highlight-none"><div class="highlight"><pre>Load &quot;guilib.ring&quot;
1152
1153 app=new qApp
1154 {
1155         frmBefore=new Qwidget()
1156         {
1157                 setWindowTitle(&quot;before!&quot;)
1158                 resize(300,320)
1159                 move(200,200)
1160
1161                 button=new qPushButton(frmBefore)
1162                 {
1163                         setText(&quot;Close&quot;)
1164                         setClickEvent(&quot;frmBefore.close() frmMain.show()&quot;)
1165                 }
1166
1167                 show()
1168         }
1169
1170         frmMain=new Qwidget()
1171         {
1172                 setWindowTitle(&quot;After!&quot;)
1173                 resize(300,320)
1174                 move(200,200)
1175         }
1176
1177         exec()
1178
1179 }
1180 </pre></div>
1181 </div>
1182 </div>
1183 <div class="section" id="index-38">
1184 <span id="id21"></span><h2>モーダルウィンドウの作成方法は?<a class="headerlink" href="#index-38" title="このヘッドラインへのパーマリンク">¶</a></h2>
1185 <p>この用例は、モーダルウィンドウの作成方法です。</p>
1186 <div class="highlight-ring"><div class="highlight"><pre><span class="k">load</span> <span class="s">&quot;guilib.ring&quot;</span>
1187 <span class="n">app</span><span class="o">=</span><span class="k">new</span> <span class="n">qApp</span>
1188 <span class="p">{</span>
1189         <span class="n">frmStart</span><span class="o">=</span><span class="k">new</span> <span class="n">Qwidget</span><span class="p">()</span>
1190         <span class="p">{</span>
1191                 <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&quot;The First Window&quot;</span><span class="p">)</span>
1192                 <span class="n">resize</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span><span class="mi">320</span><span class="p">)</span>
1193                 <span class="n">move</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span>
1194
1195                 <span class="n">button</span><span class="o">=</span><span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">frmStart</span><span class="p">)</span>
1196                 <span class="p">{</span>
1197                         <span class="n">setText</span><span class="p">(</span><span class="s">&quot;Show Modal Window&quot;</span><span class="p">)</span>
1198                         <span class="n">resize</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
1199                         <span class="n">setClickEvent</span><span class="p">(</span><span class="s">&quot;frmModal.show()&quot;</span><span class="p">)</span>
1200                 <span class="p">}</span>
1201
1202                 <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">frmStart</span><span class="p">)</span>
1203                 <span class="p">{</span>
1204                         <span class="n">setText</span><span class="p">(</span><span class="s">&quot;Close Window&quot;</span><span class="p">)</span>
1205                         <span class="n">move</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">50</span><span class="p">)</span>
1206                         <span class="n">resize</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
1207                         <span class="n">setClickEvent</span><span class="p">(</span><span class="s">&quot;frmStart.Close()&quot;</span><span class="p">)</span>
1208                 <span class="p">}</span>
1209
1210                 <span class="n">show</span><span class="p">()</span>
1211         <span class="p">}</span>
1212
1213         <span class="n">frmModal</span> <span class="o">=</span><span class="k">new</span> <span class="n">Qwidget</span><span class="p">()</span>
1214         <span class="p">{</span>
1215                 <span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&quot;Modal Window&quot;</span><span class="p">)</span>
1216                 <span class="n">resize</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span><span class="mi">320</span><span class="p">)</span>
1217                 <span class="n">move</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span>
1218                 <span class="n">setparent</span><span class="p">(</span><span class="n">frmStart</span><span class="p">)</span>
1219                 <span class="n">setwindowmodality</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span>
1220                 <span class="n">setwindowflags</span><span class="p">(</span><span class="n">Qt_Dialog</span><span class="p">)</span>
1221         <span class="p">}</span>
1222
1223         <span class="n">exec</span><span class="p">()</span>
1224
1225 <span class="p">}</span>
1226 </pre></div>
1227 </div>
1228 <p>関連資料:</p>
1229 <ul class="simple">
1230 <li><a class="reference external" href="http://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html">http://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html</a></li>
1231 <li><a class="reference external" href="http://doc.qt.io/qt-5/qt.html#WindowType-enum">http://doc.qt.io/qt-5/qt.html#WindowType-enum</a></li>
1232 <li><a class="reference external" href="http://doc.qt.io/qt-5/qwindow.html#setParent">http://doc.qt.io/qt-5/qwindow.html#setParent</a></li>
1233 <li><a class="reference external" href="http://doc.qt.io/qt-5/qt.html#WindowModality-enum">http://doc.qt.io/qt-5/qt.html#WindowModality-enum</a></li>
1234 </ul>
1235 </div>
1236 <div class="section" id="index-39">
1237 <span id="id22"></span><h2>最大化ボタンの無効化およびウィンドウのサイズを変更するには?<a class="headerlink" href="#index-39" title="このヘッドラインへのパーマリンク">¶</a></h2>
1238 <p>setWindowFlags() メソッドを使用します。</p>
1239 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">&quot;guilib.ring&quot;</span>
1240 <span class="n">app1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qapp</span> <span class="p">{</span>
1241                 <span class="n">win1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qwidget</span><span class="p">()</span> <span class="p">{</span>
1242                                 <span class="n">setwindowtitle</span><span class="p">(</span><span class="s">&quot;First&quot;</span><span class="p">)</span>
1243                                 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">500</span><span class="p">,</span><span class="mi">500</span><span class="p">)</span>
1244
1245                                 <span class="k">new</span> <span class="n">qpushbutton</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span> <span class="p">{</span>
1246                                                 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
1247                                                 <span class="n">settext</span><span class="p">(</span><span class="s">&quot;close&quot;</span><span class="p">)</span>
1248                                                 <span class="n">setclickevent</span><span class="p">(</span><span class="s">&quot;app1.quit()&quot;</span><span class="p">)</span>
1249                                 <span class="p">}</span>
1250
1251                                 <span class="k">new</span> <span class="n">qpushbutton</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span> <span class="p">{</span>
1252                                                 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">250</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
1253                                                 <span class="n">settext</span><span class="p">(</span><span class="s">&quot;Second&quot;</span><span class="p">)</span>
1254                                                 <span class="n">setclickevent</span><span class="p">(</span><span class="s">&quot;second()&quot;</span><span class="p">)</span>
1255                                 <span class="p">}</span>
1256
1257                                 <span class="n">showmaximized</span><span class="p">()</span>
1258                 <span class="p">}</span>
1259                 <span class="n">exec</span><span class="p">()</span>
1260 <span class="p">}</span>
1261
1262 <span class="k">func</span> <span class="n">second</span>
1263                 <span class="n">win2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qwidget</span><span class="p">()</span> <span class="p">{</span>
1264                                 <span class="n">setwindowtitle</span><span class="p">(</span><span class="s">&quot;Second&quot;</span><span class="p">)</span>
1265                                 <span class="n">setgeometry</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">500</span><span class="p">,</span><span class="mi">500</span><span class="p">)</span>
1266                                 <span class="n">setwindowflags</span><span class="p">(</span><span class="n">Qt_dialog</span><span class="p">)</span>
1267                                 <span class="n">show</span><span class="p">()</span>
1268                 <span class="p">}</span>
1269 </pre></div>
1270 </div>
1271 </div>
1272 <div class="section" id="odbc-sqlite">
1273 <span id="index-40"></span><h2>ODBC から SQLite を使うには?<a class="headerlink" href="#odbc-sqlite" title="このヘッドラインへのパーマリンク">¶</a></h2>
1274 <p>Ring 1.1 以降では SQLite に標準対応しており ODBC は不要です。</p>
1275 <p>また、 RingQt から SQLite へアクセスできます。</p>
1276 <p>質問への回答</p>
1277 <div class="highlight-ring"><div class="highlight"><pre><span class="n">pODBC</span> <span class="o">=</span> <span class="n">odbc_init</span><span class="p">()</span>
1278 <span class="n">odbc_connect</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;DRIVER=SQLite3 ODBC Driver;Database=mydb.db;LongNames=0;&quot;</span><span class="o">+</span>
1279                    <span class="s">&quot;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;&quot;</span><span class="p">)</span>
1280 <span class="n">odbc_execute</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;create table &#39;tel&#39; (&#39;ID&#39;,&#39;NAME&#39;,&#39;PHONE&#39;);&quot;</span><span class="p">)</span>
1281 <span class="n">odbc_execute</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;insert into &#39;tel&#39; values (&#39;1&#39;,&#39;Mahmoud&#39;,&#39;123456&#39;);&quot;</span><span class="p">)</span>
1282 <span class="n">odbc_execute</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;insert into &#39;tel&#39; values (&#39;2&#39;,&#39;Ahmed&#39;,&#39;123456&#39;);&quot;</span><span class="p">)</span>
1283 <span class="n">odbc_execute</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;insert into &#39;tel&#39; values (&#39;3&#39;,&#39;Ibrahim&#39;,&#39;123456&#39;);&quot;</span><span class="p">)</span>
1284 <span class="n">odbc_execute</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;select * from tel&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span>
1285 <span class="n">nMax</span> <span class="o">=</span> <span class="n">odbc_colcount</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1286 <span class="k">See</span> <span class="s">&quot;Columns Count : &quot;</span> <span class="o">+</span> <span class="n">nMax</span> <span class="o">+</span> <span class="n">nl</span>
1287 <span class="k">while</span> <span class="n">odbc_fetch</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1288         <span class="k">See</span> <span class="n">nl</span>
1289         <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="n">nMax</span>
1290                 <span class="k">see</span> <span class="n">odbc_getdata</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="n">x</span><span class="p">)</span>
1291                 <span class="k">if</span> <span class="n">x</span> <span class="o">!=</span> <span class="n">nMax</span> <span class="k">see</span> <span class="s">&quot; - &quot;</span> <span class="k">ok</span>
1292         <span class="k">next</span>
1293 <span class="k">end</span>
1294 <span class="n">odbc_disconnect</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1295 <span class="n">odbc_close</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1296 </pre></div>
1297 </div>
1298 <p>実行結果:</p>
1299 <div class="highlight-none"><div class="highlight"><pre>Columns Count : 3
1300
1301 1 - Mahmoud - 123456
1302 2 - Ahmed - 123456
1303 3 - Ibrahim - 123456
1304 </pre></div>
1305 </div>
1306 <p>このプログラムは、ファイルを作成します : mydb.db</p>
1307 <p>注意 : ODBC ドライバを表示したとき、そこにある長いリストを確認できます。</p>
1308 <div class="highlight-none"><div class="highlight"><pre>SQLite3 ODBC Driver - UsageCount=1
1309 SQLite ODBC Driver - UsageCount=1
1310 SQLite ODBC (UTF-8) Driver - UsageCount=1
1311 </pre></div>
1312 </div>
1313 <p>そして “SQLite3 ODBC Driver” を使用しています。</p>
1314 </div>
1315 <div class="section" id="dbase-harbour">
1316 <span id="index-41"></span><h2>dBase/Harbour データベースへ接続できますか?<a class="headerlink" href="#dbase-harbour" title="このヘッドラインへのパーマリンク">¶</a></h2>
1317 <p>多種多様なデータベースを ODBC で接続できます。</p>
1318 <p>xBase ファイル (*.DBF) へ接続するには、</p>
1319 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;Using DBF Files using ODBC&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1320 <span class="n">pODBC</span> <span class="o">=</span> <span class="n">odbc_init</span><span class="p">()</span>
1321 <span class="k">See</span> <span class="s">&quot;Connect to database&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1322 <span class="n">odbc_connect</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;Driver={Microsoft dBase Driver (*.dbf)};&quot;</span><span class="o">+</span>
1323                    <span class="s">&quot;datasource=dBase Files;DriverID=277&quot;</span><span class="p">)</span>
1324 <span class="k">See</span> <span class="s">&quot;Select data&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1325 <span class="n">odbc_execute</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;select * from tel.dbf&quot;</span><span class="p">)</span>
1326 <span class="n">nMax</span> <span class="o">=</span> <span class="n">odbc_colcount</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1327 <span class="k">See</span> <span class="s">&quot;Columns Count : &quot;</span> <span class="o">+</span> <span class="n">nMax</span> <span class="o">+</span> <span class="n">nl</span>
1328 <span class="k">while</span> <span class="n">odbc_fetch</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1329            <span class="k">See</span> <span class="s">&quot;Row data:&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1330            <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="n">nMax</span>
1331                            <span class="k">see</span> <span class="n">odbc_getdata</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; - &quot;</span>
1332            <span class="k">next</span>
1333 <span class="k">end</span>
1334 <span class="k">See</span> <span class="s">&quot;Close database...&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1335 <span class="n">odbc_disconnect</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1336 <span class="n">odbc_close</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1337 </pre></div>
1338 </div>
1339 <p>実行結果</p>
1340 <div class="highlight-none"><div class="highlight"><pre>Using DBF Files using ODBC
1341 Connect to database
1342 Select data
1343 Columns Count : 3
1344 Row data:
1345 Ahmad - Egypt - 234567 - Row data:
1346 Fady - Egypt - 345678 - Row data:
1347 Shady - Egypt - 456789 - Row data:
1348 Mahmoud - Egypt - 123456 - Close database...
1349 </pre></div>
1350 </div>
1351 <p>また Visual FoxPro データベースにも接続できます (Visual FoxPro ドライバのインストールが必要です)。</p>
1352 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;ODBC test 6&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1353 <span class="n">pODBC</span> <span class="o">=</span> <span class="n">odbc_init</span><span class="p">()</span>
1354 <span class="k">See</span> <span class="s">&quot;Connect to database&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1355 <span class="n">odbc_connect</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;Driver={Microsoft Visual FoxPro Driver};&quot;</span><span class="o">+</span>
1356         <span class="s">&quot;SourceType=DBC;SourceDB=C:\PWCT19\ssbuild\PWCTDATA</span><span class="se">\C</span><span class="s">H1\Data\mydata.dbc;&quot;</span><span class="p">)</span>
1357 <span class="k">See</span> <span class="s">&quot;Select data&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1358 <span class="k">see</span> <span class="n">odbc_execute</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="s">&quot;select * from t38&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">nl</span>
1359 <span class="n">nMax</span> <span class="o">=</span> <span class="n">odbc_colcount</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1360 <span class="k">See</span> <span class="s">&quot;Columns Count : &quot;</span> <span class="o">+</span> <span class="n">nMax</span> <span class="o">+</span> <span class="n">nl</span>
1361 <span class="k">while</span> <span class="n">odbc_fetch</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1362         <span class="k">See</span> <span class="s">&quot;Row data:&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1363         <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="n">nMax</span>
1364                 <span class="k">see</span> <span class="n">odbc_getdata</span><span class="p">(</span><span class="n">pODBC</span><span class="p">,</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; - &quot;</span>
1365         <span class="k">next</span>
1366 <span class="k">end</span>
1367 <span class="k">See</span> <span class="s">&quot;Close database...&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1368 <span class="n">odbc_disconnect</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1369 <span class="n">odbc_close</span><span class="p">(</span><span class="n">pODBC</span><span class="p">)</span>
1370 </pre></div>
1371 </div>
1372 </div>
1373 <div class="section" id="setclickevent">
1374 <span id="index-42"></span><h2>setClickEvent() はオブジェクトのメソッドを直接参照しない理由は?<a class="headerlink" href="#setclickevent" title="このヘッドラインへのパーマリンク">¶</a></h2>
1375 <p>setClickEvent(cCode) は、コードを有する文字列を受け入れます。 イベントの発生時にコードは実行されます。</p>
1376 <p>Ring は 手続き型、オブジェクト指向、関数型など様々なプログラミングパラダイムに対応しています。</p>
1377 <p>プログラミング言語の水準で様々なパラダイムに対応するときは、二つの選択肢のうち、どちらのパラダイムが使用されるのか検出することはできません。</p>
1378 <ol class="arabic simple">
1379 <li>各種プログラミングパラダイムで動作する一般的な解決方法があります。</li>
1380 <li>あるパラダイムのうちの一つと合致する各種解決方法があります。</li>
1381 </ol>
1382 <p>setClickEvent() および、そのほかは (様々なプログラミングパラダイムで動作する一般的な解決方法) に所属しています。</p>
1383 <p>クラスとオブジェクトの取り扱いに関する注意を一切しなくても、文字列のコードを渡すことで実行されます。</p>
1384 <p>このコードは関数の呼び出し、メソッドの呼び出しと変数の値の設定などができました。</p>
1385 <p>そのほかのプログラミング言語では、イベントでオブジェクト指向プログラミングとメソッドの呼び出しの使用を強制します。また、現在のオブジェクトなどの仮引数を取得するために無名関数を使用します。</p>
1386 <p>現在、一般的な解決方法は方法はありますが、将来は、特定のパラダイムと合致する
1387 明確な解決方法を追加する場合があります (オブジェクト指向、宣言型プログラミング、および自然言語プログラミング)。</p>
1388 </div>
1389 <div class="section" id="index-43">
1390 <span id="id23"></span><h2>定義エラーを起こさずに関数を呼び出せる理由は?<a class="headerlink" href="#index-43" title="このヘッドラインへのパーマリンク">¶</a></h2>
1391 <p>プログラムは次の順序に従います。</p>
1392 <ol class="arabic simple">
1393 <li>ファイルの読み込み</li>
1394 <li>グローバル変数とステートメント</li>
1395 <li>関数</li>
1396 <li>パッケージ、クラスとメソッド</li>
1397 </ol>
1398 <p>どのような意味がありますか?</p>
1399 <ol class="arabic simple">
1400 <li>**** 関数がない場合は、その後はクラスとなります。 ****</li>
1401 <li>**** 関数、メソッド、クラス、パッケージを終わらせるための命令は不要です。 ****</li>
1402 </ol>
1403 <p>この用例をご確認ください。</p>
1404 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;Hello&quot;</span>
1405 <span class="n">test</span><span class="p">()</span>
1406 <span class="k">func</span> <span class="n">test</span>
1407     <span class="k">see</span> <span class="s">&quot;message from the test function!&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1408 <span class="k">class</span> <span class="n">test</span>
1409 </pre></div>
1410 </div>
1411 <p>前述の用例では、 test() 関数があるため test() を用いて直接的に呼び出せます。</p>
1412 <p>この用例では、 test() がメソッドになります。</p>
1413 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;Hello&quot;</span>
1414 <span class="n">test</span><span class="p">()</span>    <span class="c"># ランタイムエラーメッセージ</span>
1415 <span class="k">class</span> <span class="n">test</span>
1416         <span class="k">func</span> <span class="n">test</span> <span class="c"># Test() はメソッドです (関数ではない)</span>
1417                 <span class="k">see</span> <span class="s">&quot;message from the test method!&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1418 </pre></div>
1419 </div>
1420 <p>メソッドの定義後に、関数を直接呼び出そうとしたときはエラーになります。</p>
1421 <p>前述のプログラムは必ずこの通りにしてください。</p>
1422 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;Hello&quot;</span>
1423 <span class="k">new</span> <span class="n">test</span> <span class="p">{</span> <span class="n">test</span><span class="p">()</span> <span class="p">}</span>   <span class="c"># メソッドの呼び出し</span>
1424 <span class="k">class</span> <span class="n">test</span>
1425         <span class="k">func</span> <span class="n">test</span> <span class="c"># Test() はメソッドです (関数ではない)</span>
1426                 <span class="k">see</span> <span class="s">&quot;message from the test method!&quot;</span> <span class="o">+</span> <span class="n">nl</span>
1427 </pre></div>
1428 </div>
1429 </div>
1430 <div class="section" id="ringqt">
1431 <span id="index-44"></span><h2>RingQt の拡張機能とクラスの追加方法は?<a class="headerlink" href="#ringqt" title="このヘッドラインへのパーマリンク">¶</a></h2>
1432 <p>一般に C または C++ のコードで Ring を拡張します。</p>
1433 <p>Ring のコードから C 関数の呼び出し、または C++ クラスとメソッドを使えます。</p>
1434 <p>詳細情報は、本取扱説明書の「C/C++ による拡張機能の開発方法」をご確認ください。</p>
1435 <p>このコードの用例では Ring ライブラリ (*.lib) を使用して *.c ファイルを DLL ファイルへコンパイルします。</p>
1436 <div class="highlight-c"><div class="highlight"><pre><span class="cp">#include &quot;ring.h&quot;</span>
1437
1438 <span class="n">RING_FUNC</span><span class="p">(</span><span class="n">ring_ringlib_dlfunc</span><span class="p">)</span>
1439 <span class="p">{</span>
1440         <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Message from dlfunc&quot;</span><span class="p">);</span>
1441 <span class="p">}</span>
1442
1443 <span class="n">RING_API</span> <span class="kt">void</span> <span class="n">ringlib_init</span><span class="p">(</span><span class="n">RingState</span> <span class="o">*</span><span class="n">pRingState</span><span class="p">)</span>
1444 <span class="p">{</span>
1445         <span class="n">ring_vm_funcregister</span><span class="p">(</span><span class="s">&quot;dlfunc&quot;</span><span class="p">,</span><span class="n">ring_ringlib_dlfunc</span><span class="p">);</span>
1446 <span class="p">}</span>
1447 </pre></div>
1448 </div>
1449 <p>Ring は、 LoadLib() 関数で DLL ファイルを読み込んだ後に Ring 関数から dlfunc() 関数が呼び出されます。その後に C 関数を呼び出します。</p>
1450 <div class="highlight-ring"><div class="highlight"><pre><span class="k">See</span> <span class="s">&quot;Dynamic DLL&quot;</span> <span class="o">+</span> <span class="n">NL</span>
1451 <span class="n">LoadLib</span><span class="p">(</span><span class="s">&quot;ringlib.dll&quot;</span><span class="p">)</span>
1452 <span class="n">dlfunc</span><span class="p">()</span>
1453 </pre></div>
1454 </div>
1455 <p>実行結果:</p>
1456 <div class="highlight-none"><div class="highlight"><pre>Dynamic DLL
1457 Message from dlfunc
1458 </pre></div>
1459 </div>
1460 <p>取扱説明書を読むと、仮引数 (文字列、数値、リストとオブジェクト) などの取得方法について知ることができます。</p>
1461 <p>また、関数から値 (任意型) を返す方法も知ることができます。</p>
1462 <p>実体験ですが、 C ライブラリまたは C++ ライブラリへ対応作業をしているとき、</p>
1463 <p>ほとんどの関数で、ほとんどのコードを共有していることを発見しました。</p>
1464 <p>こちらのコード生成器を使うと Ring 用の C/C++ ライブラリのラッパーを手軽に生成でき、時間の節約になります。</p>
1465 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/codegen/parsec.ring">https://github.com/ring-lang/ring/blob/master/extensions/codegen/parsec.ring</a></p>
1466 <p>コード生成器は 1200 行以下の Ring プログラムです。</p>
1467 <p>コード生成器で入力した設定ファイルには C/C++ ライブラリの情報があります。</p>
1468 <p>関数プロトタイプ、クラスとメソッド、定数、列挙体、構造体とメンバなど。</p>
1469 <p>そして、コード生成器で生成します。</p>
1470 <ul class="simple">
1471 <li>C ライブラリに関する *.C ファイル (ライブラリ関数を使用可能)</li>
1472 <li>C++ ライブラリに関する *.CPP ファイル (C++ クラスとメソッドを使用可能)</li>
1473 <li>*.Ring ファイル (C++ のクラスを Ring のクラスとして使用可能)</li>
1474 <li>*.RH ファイル (定数)</li>
1475 </ul>
1476 <p>コード生成器の動作を理解するには、この Allegro ゲームプログラミング・ライブラリ用の拡張機能をご確認ください。</p>
1477 <p><a class="reference external" href="https://github.com/ring-lang/ring/tree/master/extensions/ringallegro">https://github.com/ring-lang/ring/tree/master/extensions/ringallegro</a></p>
1478 <p>ひとつ目の設定ファイルは、</p>
1479 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/allegro.cf">https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/allegro.cf</a></p>
1480 <p>このファイルは Allegro の取扱説明書と Ring コード生成器の規則を用いて記述しました。</p>
1481 <p>このバッチファイルでコード生成器を実行します。</p>
1482 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/gencode.bat">https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/gencode.bat</a></p>
1483 <p>または、このスクリプトを使用します。</p>
1484 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/gencode.sh">https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/gencode.sh</a></p>
1485 <p>生成されたソースコードファイルを取得します。</p>
1486 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/ring_allegro.c">https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/ring_allegro.c</a></p>
1487 <p>生成されたソースコードファイル (ring_allegro.c) は約 1,2000 行です。</p>
1488 <p>ですが、設定ファイルは 1000 行以下です。</p>
1489 <p>ライブラリをビルドするには (DLL ファイルの作成)</p>
1490 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/buildvc.bat">https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/buildvc.bat</a></p>
1491 <p>また、この拡張機能は LibSDL ライブラリに関して確認できます。</p>
1492 <p><a class="reference external" href="https://github.com/ring-lang/ring/tree/master/extensions/ringsdl">https://github.com/ring-lang/ring/tree/master/extensions/ringsdl</a></p>
1493 <p>まとめとして、知っておく必要のある関連事項は</p>
1494 <p>1 - 設定ファイルの記述</p>
1495 <p>2 - コード生成器の使用</p>
1496 <p>3 - ライブラリや拡張機能の作成</p>
1497 <p>4 - Ring コードからライブラリや拡張機能を使用</p>
1498 <p>さて Qt についての質問へ移りましょう。</p>
1499 <p>RingQt は Ringの拡張機能です (ringqt.dll)。</p>
1500 <p>Ring の改修や変更は不要です。</p>
1501 <ol class="arabic simple">
1502 <li>RingQt の変更が必要です。</li>
1503 <li>または、別の Qt ベースの拡張機能により、 Ring の機能を拡張します (だだし、同じ Qt バージョンです)。</li>
1504 </ol>
1505 <p>最初の選択肢に関しては RingQt を参照してください。</p>
1506 <p><a class="reference external" href="https://github.com/ring-lang/ring/tree/master/extensions/ringqt">https://github.com/ring-lang/ring/tree/master/extensions/ringqt</a></p>
1507 <p>設定ファイル</p>
1508 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringqt/qt.cf">https://github.com/ring-lang/ring/blob/master/extensions/ringqt/qt.cf</a></p>
1509 <p>ソースコードを生成するには</p>
1510 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencode.bat">https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencode.bat</a></p>
1511 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencode.sh">https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencode.sh</a></p>
1512 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencodeandroid.bat">https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencodeandroid.bat</a></p>
1513 <p>DLL/so/Dylib ファイルをビルドするには</p>
1514 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildmingw32.bat">https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildmingw32.bat</a></p>
1515 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildgcc.sh">https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildgcc.sh</a></p>
1516 <p><a class="reference external" href="https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildclang.sh">https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildclang.sh</a></p>
1517 <p>RingQt の学習をしてください。</p>
1518 <p>利用できる選択肢について学んでください。</p>
1519 <ol class="arabic simple">
1520 <li>直接 Qt のクラスを接続します。</li>
1521 <li>新しい自作クラスを接続するために新しいクラスを作成します。</li>
1522 </ol>
1523 <p>第二の選択肢は (前述の二つの要点、またはそれ以前にある2つの要点)、</p>
1524 <p>C++ コードによる新しいクラスを作成します。</p>
1525 <p>そして、作成したクラスを RingQt へ統合、または特別な DLL を用意します (判断に応じて)。</p>
1526 <p>一般的な動作ならば、 RingQt に記述してください (他の人の手助けになります)。</p>
1527 <p>特別な動作ならば、別の拡張機能に記述してください (特定のアプリケーション)。</p>
1528 </div>
1529 <div class="section" id="combobox-qtablewidget">
1530 <span id="index-45"></span><h2>Combobox および QTableWidget のセルへ他の要素を追加するには?<a class="headerlink" href="#combobox-qtablewidget" title="このヘッドラインへのパーマリンク">¶</a></h2>
1531 <p>このコードをご確認ください。</p>
1532 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">&quot;guilib.ring&quot;</span>
1533 <span class="k">New</span> <span class="n">qApp</span>
1534 <span class="p">{</span>
1535         <span class="n">win1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qMainWindow</span><span class="p">()</span> <span class="p">{</span>
1536                 <span class="n">setGeometry</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">1100</span><span class="p">,</span><span class="mi">370</span><span class="p">)</span>
1537                 <span class="n">setwindowtitle</span><span class="p">(</span><span class="s">&quot;Using QTableWidget&quot;</span><span class="p">)</span>
1538
1539                 <span class="n">Table1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qTableWidget</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span> <span class="p">{</span>
1540                         <span class="n">setrowcount</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="n">setcolumncount</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
1541                         <span class="n">setGeometry</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">800</span><span class="p">,</span><span class="mi">400</span><span class="p">)</span>
1542                         <span class="n">setselectionbehavior</span><span class="p">(</span><span class="n">QAbstractItemView_SelectRows</span><span class="p">)</span>
1543
1544                         <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">10</span>
1545                                 <span class="k">for</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">10</span>
1546                                         <span class="n">item1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qtablewidgetitem</span><span class="p">(</span><span class="s">&quot;R&quot;</span><span class="o">+</span><span class="n">X</span><span class="o">+</span><span class="s">&quot;C&quot;</span><span class="o">+</span><span class="n">Y</span><span class="p">)</span>
1547                                         <span class="n">setitem</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">y</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">item1</span><span class="p">)</span>
1548                                 <span class="k">next</span>
1549                         <span class="k">next</span>
1550
1551                         <span class="n">cmb</span> <span class="o">=</span> <span class="k">new</span> <span class="n">QComboBox</span><span class="p">(</span><span class="n">Table1</span><span class="p">)</span> <span class="p">{</span>
1552                                 <span class="n">alist</span> <span class="o">=</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="p">,</span><span class="s">&quot;four&quot;</span><span class="p">,</span><span class="s">&quot;five&quot;</span><span class="o">]</span>
1553                                 <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">aList</span> <span class="n">additem</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="k">next</span>
1554                         <span class="p">}</span>
1555                                 <span class="n">setCellWidget</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="n">cmb</span><span class="p">)</span>
1556                 <span class="p">}</span>
1557
1558                 <span class="n">setcentralwidget</span><span class="p">(</span><span class="n">table1</span><span class="p">)</span>
1559                 <span class="n">show</span><span class="p">()</span>
1560         <span class="p">}</span>
1561         <span class="n">exec</span><span class="p">()</span>
1562 <span class="p">}</span>
1563 </pre></div>
1564 </div>
1565 </div>
1566 <div class="section" id="qtablewidget">
1567 <span id="index-46"></span><h2>QTableWidget で選択されたセルの内容に処理を行うには?<a class="headerlink" href="#qtablewidget" title="このヘッドラインへのパーマリンク">¶</a></h2>
1568 <p>このサンプルをご確認ください。</p>
1569 <div class="highlight-ring"><div class="highlight"><pre><span class="k">Load</span> <span class="s">&quot;guilib.ring&quot;</span>
1570
1571 <span class="k">New</span> <span class="n">qApp</span> <span class="p">{</span>
1572         <span class="n">win1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qMainWindow</span><span class="p">()</span> <span class="p">{</span>
1573                 <span class="n">setGeometry</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">800</span><span class="p">,</span><span class="mi">600</span><span class="p">)</span>
1574                 <span class="n">setwindowtitle</span><span class="p">(</span><span class="s">&quot;Using QTableWidget&quot;</span><span class="p">)</span>
1575                 <span class="n">Table1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qTableWidget</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span> <span class="p">{</span>
1576                         <span class="n">setrowcount</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="n">setcolumncount</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
1577                         <span class="n">setGeometry</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">400</span><span class="p">,</span><span class="mi">400</span><span class="p">)</span>
1578                         <span class="k">for</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">10</span>
1579                                 <span class="k">for</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">to</span> <span class="mi">10</span>
1580                                         <span class="n">item1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qtablewidgetitem</span><span class="p">(</span><span class="s">&quot;10&quot;</span><span class="p">)</span>
1581                                         <span class="n">setitem</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">y</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">item1</span><span class="p">)</span>
1582                                 <span class="k">next</span>
1583                         <span class="k">next</span>
1584                 <span class="p">}</span>
1585                 <span class="n">btn1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">qPushButton</span><span class="p">(</span><span class="n">win1</span><span class="p">)</span> <span class="p">{</span>
1586                         <span class="n">setText</span><span class="p">(</span><span class="s">&quot;Increase&quot;</span><span class="p">)</span>
1587                         <span class="n">setGeometry</span><span class="p">(</span><span class="mi">510</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span><span class="mi">30</span><span class="p">)</span>
1588                         <span class="n">setClickEvent</span><span class="p">(</span><span class="s">&quot;pClick()&quot;</span><span class="p">)</span>
1589                 <span class="p">}</span>
1590                 <span class="n">show</span><span class="p">()</span>
1591         <span class="p">}</span>
1592         <span class="n">exec</span><span class="p">()</span>
1593 <span class="p">}</span>
1594
1595 <span class="k">func</span> <span class="n">pClick</span>
1596         <span class="k">for</span> <span class="n">nRow</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">to</span> <span class="n">Table1</span><span class="p">.</span><span class="n">rowcount</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span>
1597                 <span class="k">for</span> <span class="n">nCol</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">to</span> <span class="n">Table1</span><span class="p">.</span><span class="n">columncount</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span>
1598                         <span class="n">Table1</span><span class="p">.</span><span class="n">item</span><span class="p">(</span><span class="n">nRow</span><span class="p">,</span><span class="n">nCol</span><span class="p">)</span>  <span class="p">{</span>
1599                                 <span class="k">if</span> <span class="n">isSelected</span><span class="p">()</span>
1600                                         <span class="n">setText</span><span class="p">(</span> <span class="s">&quot;&quot;</span> <span class="o">+</span> <span class="p">(</span> <span class="mi">10</span> <span class="o">+</span> <span class="n">text</span><span class="p">())</span> <span class="p">)</span>
1601                                 <span class="k">ok</span>
1602                         <span class="p">}</span>
1603                 <span class="k">next</span>
1604         <span class="k">next</span>
1605 </pre></div>
1606 </div>
1607 </div>
1608 <div class="section" id="index-47">
1609 <span id="id24"></span><h2>三種類の記法のうち一般に使用されている、またはコミュニティで推薦されているものは?<a class="headerlink" href="#index-47" title="このヘッドラインへのパーマリンク">¶</a></h2>
1610 <ol class="arabic">
1611 <li><dl class="first docutils">
1612 <dt>記法を選択するだけですが、同じプロジェクトで異なる記法の併用、</dt>
1613 <dd><p class="first last">または最低でも、同じコンテキストを併用しないでください (実装、テスト、スクリプトなど)。</p>
1614 </dd>
1615 </dl>
1616 </li>
1617 </ol>
1618 <div class="admonition note">
1619 <p class="first admonition-title">注釈</p>
1620 <p class="last">プロジェクトの開始時に規則の明示、およびその規則に従ってください。</p>
1621 </div>
1622 <ol class="arabic simple" start="2">
1623 <li>記法の自作ができます (キーワードの変更により) - この考えはカスタマイズと自由のためのものです。</li>
1624 </ol>
1625 <div class="admonition note">
1626 <p class="first admonition-title">注釈</p>
1627 <p class="last">自然言語を使用する場合など、明確な理由がある場合に限り、新しい記法の作成とキーワードの変更を行うほうが良いです (日本語、アラビア語、フランス語など)。</p>
1628 </div>
1629 <ol class="arabic" start="3">
1630 <li><dl class="first docutils">
1631 <dt>第一形式は質問、チュートリアル、および小規模アプリケーション・プログラム (5,000行以下のコード) には最適です (筆者個人の意見です)。</dt>
1632 <dd><p class="first last">用例 : Ring 取扱説明書、 Ring のサンプル、およびアプリケーションの大部分</p>
1633 </dd>
1634 </dl>
1635 </li>
1636 <li><p class="first">第三形式は大規模アプリケーション、および現役プログラマには最適です (筆者個人の意見です)。</p>
1637 <blockquote>
1638 <div><p>用例 (フォームデザイナー) : <a class="reference external" href="https://github.com/ring-lang/ring/tree/master/applications/formdesigner">https://github.com/ring-lang/ring/tree/master/applications/formdesigner</a></p>
1639 </div></blockquote>
1640 </li>
1641 </ol>
1642 </div>
1643 </div>
1644
1645
1646           </div>
1647         </div>
1648       </div>
1649       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
1650         <div class="sphinxsidebarwrapper"><h3>ページの内容</h3>
1651 <ul>
1652 <li><a class="reference internal" href="#">よくある質問と回答 (FAQ)</a><ul>
1653 <li><a class="reference internal" href="#yapl">第三のプログラミング言語 (YAPL) は必要か?</a><ul>
1654 <li><a class="reference internal" href="#id1">まとめ</a></li>
1655 </ul>
1656 </li>
1657 <li><a class="reference internal" href="#index-2">なぜ弱い型付けを採用したのですか?</a></li>
1658 <li><a class="reference internal" href="#lisp-smalltalk-ring">Lisp や Smalltalk よりも Ring を選ぶ利点は?</a></li>
1659 <li><a class="reference internal" href="#c-c-ring">ネイティブ C や C++ よりも Ring を選ぶ利点は?</a></li>
1660 <li><a class="reference internal" href="#ring-python-ring">Ring と Python との違いは?  Ring はオープンソースなの?</a></li>
1661 <li><a class="reference internal" href="#perl-php-python-ruby-ring">Perl, PHP, Python や Ruby よりも Ring を使用する利点は?</a></li>
1662 <li><a class="reference internal" href="#c-java-ring">C# や Java よりも Ring を使用する利点は?</a></li>
1663 <li><a class="reference internal" href="#index-8">関数型プログラミングへの対応が言及されていますが、これは他になにが起きますか?</a></li>
1664 <li><a class="reference internal" href="#index-9">シンタックスの処理ではなく自作言語の定義機能があり、コードなどで構文解析の使用を可能にしている理由は?</a></li>
1665 <li><a class="reference internal" href="#index-10">ループの中断時に数値の指定ができる理由は?</a></li>
1666 <li><a class="reference internal" href="#ring-see-give-but-ok">Ring で ‘See’, ‘Give’, ‘But’ および ‘Ok’ キーワードを採用する理由は?</a></li>
1667 <li><a class="reference internal" href="#ring">Ring においてデータ型の背景にある哲学とは?</a></li>
1668 <li><a class="reference internal" href="#index-13">Ring でのブール値とは?</a></li>
1669 <li><a class="reference internal" href="#ring-main">Ring に “Main” 関数を実装した理由は?</a></li>
1670 <li><a class="reference internal" href="#ring-1">Ring のインデックスが 1 から始まる理由は?</a></li>
1671 <li><a class="reference internal" href="#index-16">Ring が英数大小文字を区別しない理由は?</a></li>
1672 <li><a class="reference internal" href="#index-17">代入演算子で深いコピーを使用する理由は?</a></li>
1673 <li><a class="reference internal" href="#index-18">Ring にコンストラクタメソッドはありますか?</a></li>
1674 <li><a class="reference internal" href="#index-19">オブジェクトの新規作成時に起きていることは?</a></li>
1675 <li><a class="reference internal" href="#getter-setter">Getter と Setter メソッドでのアクセスにより属性を使えますか?</a></li>
1676 <li><a class="reference internal" href="#index-21">クラスを定義している間にグローバルな名前の検索を行う理由は?</a></li>
1677 <li><a class="reference internal" href="#index-22">Ring でグローバル変数とクラスの属性名間の名前衝突を回避しない理由は?</a></li>
1678 <li><a class="reference internal" href="#ftell-fseek">ftell() と fseek() でファイルの大きさを取得するには?</a></li>
1679 <li><a class="reference internal" href="#index-24">現在のソースファイルのパスを取得するには?</a></li>
1680 <li><a class="reference internal" href="#index-25">関数の定義済み仮引数またはオプションの仮引数とは?</a></li>
1681 <li><a class="reference internal" href="#index-26">リストやディクショナリでキーまたは値のみを表示するには?</a></li>
1682 <li><a class="reference internal" href="#nl">リストで nl を表示するときに変な結果になる理由は?</a></li>
1683 <li><a class="reference internal" href="#strcmp">StrCmp() の実行結果について解説していただけますか?</a></li>
1684 <li><a class="reference internal" href="#index-29">プロジェクトで複数のソースコードを使うには?</a></li>
1685 <li><a class="reference internal" href="#getchar">この用例で GetChar() を二度使用する理由は?</a></li>
1686 <li><a class="reference internal" href="#null-isnull">NULL と isNULL() 関数の用法は?</a></li>
1687 <li><a class="reference internal" href="#index-32">オブジェクトのあるリストを表示するには?</a></li>
1688 <li><a class="reference internal" href="#index-33">改行と文字を表示するには?</a></li>
1689 <li><a class="reference internal" href="#qapp">qApp クラス名末尾に () を使用しない理由は?</a></li>
1690 <li><a class="reference internal" href="#index-35">ウィンドウのタイトルバーが画面外に移動してしまう原因は?</a></li>
1691 <li><a class="reference internal" href="#gui">GUI アプリケーションでボタンの配列を作成するには?</a></li>
1692 <li><a class="reference internal" href="#index-37">ウィンドウを閉じた後に別のウィンドウを表示するには?</a></li>
1693 <li><a class="reference internal" href="#index-38">モーダルウィンドウの作成方法は?</a></li>
1694 <li><a class="reference internal" href="#index-39">最大化ボタンの無効化およびウィンドウのサイズを変更するには?</a></li>
1695 <li><a class="reference internal" href="#odbc-sqlite">ODBC から SQLite を使うには?</a></li>
1696 <li><a class="reference internal" href="#dbase-harbour">dBase/Harbour データベースへ接続できますか?</a></li>
1697 <li><a class="reference internal" href="#setclickevent">setClickEvent() はオブジェクトのメソッドを直接参照しない理由は?</a></li>
1698 <li><a class="reference internal" href="#index-43">定義エラーを起こさずに関数を呼び出せる理由は?</a></li>
1699 <li><a class="reference internal" href="#ringqt">RingQt の拡張機能とクラスの追加方法は?</a></li>
1700 <li><a class="reference internal" href="#combobox-qtablewidget">Combobox および QTableWidget のセルへ他の要素を追加するには?</a></li>
1701 <li><a class="reference internal" href="#qtablewidget">QTableWidget で選択されたセルの内容に処理を行うには?</a></li>
1702 <li><a class="reference internal" href="#index-47">三種類の記法のうち一般に使用されている、またはコミュニティで推薦されているものは?</a></li>
1703 </ul>
1704 </li>
1705 </ul>
1706
1707
1708   <h4>前のトピックへ</h4>
1709   <p class="topless"><a href="ringbeep.html"
1710                         title="前の章へ">はじめての拡張機能開発</a></p>
1711   <h4>次のトピックへ</h4>
1712   <p class="topless"><a href="generalinfo.html"
1713                         title="次の章へ">一般情報</a></p>
1714   <div role="note" aria-label="source link">
1715     <h3>このページ</h3>
1716     <ul class="this-page-menu">
1717       <li><a href="_sources/faq.txt"
1718             rel="nofollow">ソースコードを表示</a></li>
1719     </ul>
1720    </div>
1721       
1722 <form action="search.html" method="get">
1723   <input type="text" name="q" placeholder="Search" />
1724   <input type="hidden" name="check_keywords" value="yes" />
1725   <input type="hidden" name="area" value="default" />
1726 </form>
1727       
1728         </div>
1729       </div>
1730       <div class="clearer"></div>
1731     </div>
1732 <footer class="footer">
1733   <p class="pull-right">
1734     <a href="_sources/faq.txt"
1735        rel="nofollow">Page Source</a> &nbsp;
1736     <a href="#">Back to Top</a></p>
1737   <p>
1738     &copy; Copyright 2016-2020, Ring Team.<br/>
1739     Created using <a href="http://www.sphinx-doc.org/en/stable/">Sphinx</a> 1.3.6. / astropy-sphinx-theme 1.1 (isVowel)
1740   </p>
1741 </footer>
1742   </body>
1743 </html>