OSDN Git Service

89b1e259b3cf335faa428c1c641b989d6f401142
[ring-lang-081/ring.git] / docs / build / html / _sources / whatisnew7.txt
1 .. index:: 
2         single: Ring 1.7 の変更履歴; はじめに
3
4 =======================
5 Ring 1.7 の変更履歴
6 =======================
7
8 Ring 1.7 公開版の新機能と変更点を学びます。
9
10 .. index:: 
11         pair: Ring 1.7 の変更履歴; 新機能と変更リスト
12
13 新機能と変更リスト
14 ==================
15
16 Ring 1.7 の新機能!
17
18 * 新しい命令: Load Package
19 * ringvm_see() と ringvm_give() 関数
20 * ring_state_new() と ring_state_mainfile() 関数
21 * トレースライブラリの改善
22 * Ring ノートパッドの改善
23 * RingQt の改善
24 * Ring2EXE の改善
25 * RingZip の改善
26 * 取扱説明書の改訂
27 * Ring VM の改善
28 * RingLibuv 拡張機能
29
30
31 .. index:: 
32         pair: Ring 1.7 の変更履歴; 新しい命令: Load Package
33
34 新しい命令: Load Package
35 ========================
36
37 ‘Load’ 命令により、複数の Ring ソースファイルを同じプロジェクトで使えます。
38
39 しかし、これらのファイルでは同じグローバルスコープを共有しています。
40
41 さて、 “Load Package” 命令もあります。
42
43 “Load Package” では新しいグローバルスコープへライブラリ (\*.ring ファイル) を読み込むことができます。
44
45 グローバル変数との名前衝突回避となるため、ライブラリの作成時は非常に便利です。
46
47 用例:
48
49 ファイル: loadpackage.ring
50
51 .. code-block:: ring
52
53         x = 100
54         ? "Hello, World!"
55         load package "testloadpackage.ring"
56
57         ? x
58         test()
59
60 ファイル: testloadpackage.ring
61
62 .. code-block:: ring
63
64         ? "Hello from testloadpackage.ring"
65
66         x = 1000
67
68         test()
69
70         func test
71                 ? x
72
73 実行結果:
74
75 .. code-block:: none
76
77         Hello, World!
78         Hello from testloadpackage.ring
79         1000
80         100
81         1000
82
83
84
85 .. index:: 
86         pair: Ring 1.7 の変更履歴; ringvm_see() と ringvm_give() 関数
87
88 ringvm_see() と ringvm_give() 関数
89 ==================================
90
91 ringvm_see() 関数で See 命令の挙動を変更します。
92
93 また ring_see() 関数で元の挙動を使用します。
94
95 用例:
96
97 .. code-block:: ring
98
99         see "Hello world" + nl
100         see 123 + nl
101         see ["one","two","three"]
102         see new point {x=10 y=20 z=30} 
103
104         func ringvm_see t
105                 ring_see("We want to print: ")
106                 ring_See(t)
107
108         class point x y z
109
110 実行結果:
111
112 .. code-block:: none
113
114         We want to print: Hello world
115         We want to print: 123
116         We want to print: one
117         two
118         three
119         We want to print: x: 10.000000
120         y: 20.000000
121         z: 30.000000
122
123 ringvm_give() 関数は Give 命令の挙動を変更します。
124
125 また、 ring_give() 関数は元の挙動を使用します。
126
127 用例:
128
129 .. code-block:: ring
130
131         see "Name: " give name
132         see "Hello " + name
133
134         func ringvm_give
135                 see "Mahmoud" + nl
136                 return "Mahmoud"
137
138 実行結果:
139
140 .. code-block:: ring
141
142         Name: Mahmoud
143         Hello Mahmoud
144
145 .. index:: 
146         pair: Ring 1.7 の変更履歴; ring_state_new() と ring_state_mainfile() 関数
147
148 ring_state_new() と ring_state_mainfile() 関数
149 ==============================================
150
151 ring_state_new() と ring_state_mainfile() 関数は Ring プログラムから別の Ring プログラムを実行します。
152
153 ring_state_main() 関数とは異なり、こちらは Ring ステートの削除時に制御できます!
154
155 これは GUI プログラムから別の GUI プログラムを実行するときに重要です。
156
157 この場合は GUI ライブラリ (RingQt) を共有しており、
158
159 呼び出し元は qApp.Exec() を呼び出すからです。
160
161 よって、下位プログラムを停止せずにメインプログラムへ戻ります。
162
163 ここで下位プログラムのステートを削除してしまうと、下位プログラムのイベント実行時に問題が発生します。
164
165 ステートを保持することは、下位 GUI プログラムの収容先となっている GUI プログラムでは重要です。
166
167
168 .. index:: 
169         pair: Ring 1.7 の変更履歴; トレースライブラリの改善
170
171 トレースライブラリの改善
172 ========================
173
174 トレースライブラリの更新により、デバッガのブレークポイントで “callstack” 命令を利用できるようになりました。
175
176 この命令は関数のコールスタックを表示します。
177
178 用例:
179
180 .. code-block:: ring
181
182         load "tracelib.ring"
183
184         func main
185                 ? "Hello from main!"
186                 test1()
187
188         func test1 
189                 ? "Hello from test1!"
190                 test2()
191
192         func test2 
193                 ? "Hello from test2!"
194                 test3()
195
196         func test3 
197                 ? "Hello from test3!"
198                 breakpoint()
199
200
201 .. image:: callstack.png
202         :alt: コールスタック
203
204 .. index:: 
205         pair: Ring 1.7 の変更履歴; Ring ノートパッドの改善
206
207 Ring ノートパッドの改善
208 =======================
209
210 Ring ノートパッドを更新しました。
211
212 (1) 拡張子 \*.cf への対応
213 (2) ハッシュ関数 (SHA256) 使用時の改善 - “Save Changes?” (変更を保存しますか?) メッセージ
214 (3) Ring ノートパッド - ×ボタン - Saving Changes? で問い合わせるようになりました。
215
216
217 .. index:: 
218         pair: Ring 1.7 の変更履歴; RingQt の改善
219
220 RingQt の改善
221 =============
222
223 このクラスを RingQt へ追加しました。
224
225 (1)  QStackedWidget
226 (2)  QCalendarWidget
227 (3)  QOpenGLFunctions
228 (4)  QOpenGLContext
229 (5)  QSurfaceFormat
230 (6)  QOpenGLWidget
231 (7)  QOpenGLVersionProfile
232 (8)  QOpenGLFunctions_3_2_Core
233 (9)  QVector2D
234 (10) QVector3D
235 (11) QVector4D
236 (12) QQuaternion
237 (13) QMatrix4x4
238 (14) QOpenGLPaintDevice
239 (15) QPaintDevice
240 (16) QOpenGLTimerQuery
241 (17) QOpenGLDebugLogger
242 (18) QOpenGLFramebufferObject
243 (19) QOpenGLVertexArrayObject
244 (20) QOpenGLBuffer
245 (21) QOpenGLShaderProgram
246 (22) QOpenGLShader
247 (23) QOpenGLTexture
248
249 .. index:: 
250         pair: Ring 1.7 の変更履歴; Ring2EXE の改善
251
252 Ring2EXE の改善
253 ===============
254
255 C/C++ コンパイラがないとき、想定された動作を行うために Ring2EXE を更新しました。
256
257 これにより、アプリケーションの配布に適したものを生成できます (exe ファイルと ring ファイル)。
258
259
260 .. index:: 
261         pair: Ring 1.7 の変更履歴; RingZip の改善
262
263 RingZip の改善
264 ==============
265
266 このライブラリの更新により、サブフォルダにあるファイルの展開に対応しました!
267
268
269 .. index:: 
270         pair: Ring 1.7 の変更履歴; 取扱説明書の改訂
271
272 取扱説明書の改訂
273 ================
274
275 (1) RingQt クラスの章 - クラスリストの並べ替えを行いました。
276
277
278 .. index:: 
279         pair: Ring 1.7 の変更履歴; Ring VM の改善
280
281 Ring VM の改善
282 ===============
283
284 (1) エラーメッセージの改善
285 (2) List2Str() 関数で数値を有するリストに対応
286 (3) 分離記号 _ のある数値の対応を修正
287 (4) 変数を使用せずにリストを作成 (ステートメント –> 式 –> リスト)
288 (5) isNULL() - 英数大小文字同一視 - Null および null は NULL と同等に扱われます。
289 (6) このオブジェクトで属性に Self オブジェクトの追加へ対応
290 (7) ‘:’ 演算子を使用後に小文字リテラルのキーワードを作成
291 (8) オブジェクトの表示 - decimals() 関数の考慮
292 (9) 定数を閉られていない場合 - 定数の始点を決定
293 (10) リストのあるオブジェクトの表示時におけるエラーメッセージの改善
294 (11) VarPtr() - ローカルスコープにある変数のポインタの取得に対応
295 (12) 新しいスレッドの作成時に perfomance 命令を normal 命令へ交換
296
297 .. index:: 
298         pair: Ring 1.7 の変更履歴; RingLibuv 拡張機能
299
300 RingLibuv 拡張機能
301 ===================
302
303 Ring 1.7 から RingLibuv 拡張機能を利用できるようなりました。
304
305 Libuv は非同期 I/O に主眼を置いたマルチプラットフォーム対応ライブラリです。
306
307 用例 (イベントループ):
308
309 .. code-block:: ring
310
311         load "libuv.ring"
312
313         counter = 0
314         idler = NULL 
315
316         func main
317                 idler = new_uv_idle_t()
318                 uv_idle_init(uv_default_loop(), idler)
319                 uv_idle_start(idler, "wait()")
320                 ? "Idling..."
321                 uv_run(uv_default_loop(), UV_RUN_DEFAULT);
322                 uv_loop_close(uv_default_loop());
323                 destroy_uv_idle_t(idler)
324
325         func wait
326                 counter++
327                 if counter >= 100000
328                         uv_idle_stop(idler)
329                 ok
330
331 実行結果:
332
333 .. code-block:: none
334
335         Idling...
336
337 用例 (サーバー):
338
339 .. code-block:: ring
340
341         load "libuv.ring"
342         load "objectslib.ring"
343
344         ? "Testing RingLibuv - Server Side - Using Classes"
345
346         open_object(:MyServer)
347
348         class MyServer from ObjectControllerParent
349
350                 DEFAULT_PORT    = 13370
351                 DEFAULT_BACKLOG = 1024
352                 
353                 addr    = new_sockaddr_in()
354                 server  = NULL
355                 client  = NULL
356                 myloop  = NULL
357                 
358                 func start
359                         myloop = uv_default_loop()
360                         server = new_uv_tcp_t()
361                         uv_tcp_init(myloop, server)
362                         uv_ip4_addr("127.0.0.1", DEFAULT_PORT, addr)
363                         uv_tcp_bind(server, addr, 0)
364                         r = uv_listen(server, DEFAULT_BACKLOG, Method(:newconnection) )
365                         if r 
366                                 ? "Listen error " + uv_strerror(r)
367                                 return 1
368                         ok
369                         uv_run(myloop, UV_RUN_DEFAULT)
370                         destroy_uv_tcp_t(server)
371                         destroy_uv_sockaddr_in(addr)
372                 
373                 func newconnection
374                         ? "New Connection"
375                         aPara   = uv_Eventpara(server,:connect)
376                         nStatus = aPara[2]
377                         if nStatus < 0
378                                 ? "New connection error : " + nStatus 
379                                 return 
380                         ok
381                         client = new_uv_tcp_t()
382                         uv_tcp_init(myloop, client)
383                         if uv_accept(server, client) = 0 
384                                         uv_read_start(client, uv_myalloccallback(), 
385                                                                 Method(:echo_read))
386                         ok
387                 
388                 func echo_read 
389                         aPara = uv_Eventpara(client,:read)
390                         nRead = aPara[2]
391                         buf   = aPara[3]
392                         if nRead > 0
393                                 req = new_uv_write_t()
394                                         wrbuf = uv_buf_init(get_uv_buf_t_base(buf), nread)
395                                 uv_write(req, client, wrbuf, 1, Method(:echo_write))
396                                 ? uv_buf2str(wrbuf)
397                                 message = "message from the server to the client"
398                                 buf = new_uv_buf_t()
399                                 set_uv_buf_t_len(buf,len(message))
400                                 set_uv_buf_t_base(buf,varptr("message","char *"))
401                                 uv_write(req, client, buf, 1, Method(:echo_write))
402                         ok
403                 
404                 func echo_write
405                         aPara = uv_Eventpara(client,:read)
406                         req   = aPara[1]
407         
408
409 実行結果:
410
411 クライアントを実行すると、 “New Connection” メッセージが表示されます。
412
413 そして “hello from the client” メッセージが表示されます。
414
415 .. code-block:: none
416
417         Testing RingLibuv - Server Side - Using Classes
418         New Connection
419         hello from the client
420
421 用例 (スレッドの使用):
422
423 .. code-block:: ring
424
425         load "libuv.ring"
426         load "objectslib.ring"
427
428         ? "Testing RingLibuv - Threads - Using Classes"
429
430         open_object(:MyThreads)
431
432         class MyThreads from ObjectControllerParent
433
434                 func Start
435                         one_id = new_uv_thread_t()
436                         two_id = new_uv_thread_t()
437                         uv_thread_create(one_id, Method(:One))
438                         uv_thread_create(two_id, Method(:Two))
439                         uv_thread_join(one_id)
440                         uv_thread_join(two_id)
441                         destroy_uv_thread_t(one_id)
442                         destroy_uv_thread_t(two_id)
443                 
444                 func one
445                         ? "Message from the First Thread!"
446                 
447                 func Two
448                         ? "Message from the Second Thread!"
449                 
450
451 実行結果:
452
453 .. code-block:: none
454
455         Testing RingLibuv - Threads - Using Classes
456         Message from the First Thread!
457         Message from the Second Thread!
458
459 この拡張機能 (RingLibuv) の詳細情報は、この章をご確認ください: RingLibuv の用法
460