2 single: Ring 1.7 の変更履歴; はじめに
4 =======================
6 =======================
8 Ring 1.7 公開版の新機能と変更点を学びます。
11 pair: Ring 1.7 の変更履歴; 新機能と変更リスト
19 * ringvm_see() と ringvm_give() 関数
20 * ring_state_new() と ring_state_mainfile() 関数
32 pair: Ring 1.7 の変更履歴; 新しい命令: Load Package
35 ========================
37 ‘Load’ 命令により、複数の Ring ソースファイルを同じプロジェクトで使えます。
39 しかし、これらのファイルでは同じグローバルスコープを共有しています。
41 さて、 “Load Package” 命令もあります。
43 “Load Package” では新しいグローバルスコープへライブラリ (\*.ring ファイル) を読み込むことができます。
45 グローバル変数との名前衝突回避となるため、ライブラリの作成時は非常に便利です。
49 ファイル: loadpackage.ring
55 load package "testloadpackage.ring"
60 ファイル: testloadpackage.ring
64 ? "Hello from testloadpackage.ring"
78 Hello from testloadpackage.ring
86 pair: Ring 1.7 の変更履歴; ringvm_see() と ringvm_give() 関数
88 ringvm_see() と ringvm_give() 関数
89 ==================================
91 ringvm_see() 関数で See 命令の挙動を変更します。
93 また ring_see() 関数で元の挙動を使用します。
99 see "Hello world" + nl
101 see ["one","two","three"]
102 see new point {x=10 y=20 z=30}
105 ring_see("We want to print: ")
114 We want to print: Hello world
115 We want to print: 123
116 We want to print: one
119 We want to print: x: 10.000000
123 ringvm_give() 関数は Give 命令の挙動を変更します。
125 また、 ring_give() 関数は元の挙動を使用します。
131 see "Name: " give name
146 pair: Ring 1.7 の変更履歴; ring_state_new() と ring_state_mainfile() 関数
148 ring_state_new() と ring_state_mainfile() 関数
149 ==============================================
151 ring_state_new() と ring_state_mainfile() 関数は Ring プログラムから別の Ring プログラムを実行します。
153 ring_state_main() 関数とは異なり、こちらは Ring ステートの削除時に制御できます!
155 これは GUI プログラムから別の GUI プログラムを実行するときに重要です。
157 この場合は GUI ライブラリ (RingQt) を共有しており、
159 呼び出し元は qApp.Exec() を呼び出すからです。
161 よって、下位プログラムを停止せずにメインプログラムへ戻ります。
163 ここで下位プログラムのステートを削除してしまうと、下位プログラムのイベント実行時に問題が発生します。
165 ステートを保持することは、下位 GUI プログラムの収容先となっている GUI プログラムでは重要です。
169 pair: Ring 1.7 の変更履歴; トレースライブラリの改善
172 ========================
174 トレースライブラリの更新により、デバッガのブレークポイントで “callstack” 命令を利用できるようになりました。
176 この命令は関数のコールスタックを表示します。
189 ? "Hello from test1!"
193 ? "Hello from test2!"
197 ? "Hello from test3!"
201 .. image:: callstack.png
205 pair: Ring 1.7 の変更履歴; Ring ノートパッドの改善
208 =======================
213 (2) ハッシュ関数 (SHA256) 使用時の改善 - “Save Changes?” (変更を保存しますか?) メッセージ
214 (3) Ring ノートパッド - ×ボタン - Saving Changes? で問い合わせるようになりました。
218 pair: Ring 1.7 の変更履歴; RingQt の改善
223 このクラスを RingQt へ追加しました。
231 (7) QOpenGLVersionProfile
232 (8) QOpenGLFunctions_3_2_Core
238 (14) QOpenGLPaintDevice
240 (16) QOpenGLTimerQuery
241 (17) QOpenGLDebugLogger
242 (18) QOpenGLFramebufferObject
243 (19) QOpenGLVertexArrayObject
245 (21) QOpenGLShaderProgram
250 pair: Ring 1.7 の変更履歴; Ring2EXE の改善
255 C/C++ コンパイラがないとき、想定された動作を行うために Ring2EXE を更新しました。
257 これにより、アプリケーションの配布に適したものを生成できます (exe ファイルと ring ファイル)。
261 pair: Ring 1.7 の変更履歴; RingZip の改善
266 このライブラリの更新により、サブフォルダにあるファイルの展開に対応しました!
270 pair: Ring 1.7 の変更履歴; 取扱説明書の改訂
275 (1) RingQt クラスの章 - クラスリストの並べ替えを行いました。
279 pair: Ring 1.7 の変更履歴; Ring VM の改善
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 命令へ交換
298 pair: Ring 1.7 の変更履歴; RingLibuv 拡張機能
303 Ring 1.7 から RingLibuv 拡張機能を利用できるようなりました。
305 Libuv は非同期 I/O に主眼を置いたマルチプラットフォーム対応ライブラリです。
317 idler = new_uv_idle_t()
318 uv_idle_init(uv_default_loop(), idler)
319 uv_idle_start(idler, "wait()")
321 uv_run(uv_default_loop(), UV_RUN_DEFAULT);
322 uv_loop_close(uv_default_loop());
323 destroy_uv_idle_t(idler)
342 load "objectslib.ring"
344 ? "Testing RingLibuv - Server Side - Using Classes"
346 open_object(:MyServer)
348 class MyServer from ObjectControllerParent
351 DEFAULT_BACKLOG = 1024
353 addr = new_sockaddr_in()
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) )
366 ? "Listen error " + uv_strerror(r)
369 uv_run(myloop, UV_RUN_DEFAULT)
370 destroy_uv_tcp_t(server)
371 destroy_uv_sockaddr_in(addr)
375 aPara = uv_Eventpara(server,:connect)
378 ? "New connection error : " + nStatus
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(),
389 aPara = uv_Eventpara(client,:read)
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))
397 message = "message from the server to the client"
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))
405 aPara = uv_Eventpara(client,:read)
411 クライアントを実行すると、 “New Connection” メッセージが表示されます。
413 そして “hello from the client” メッセージが表示されます。
417 Testing RingLibuv - Server Side - Using Classes
419 hello from the client
426 load "objectslib.ring"
428 ? "Testing RingLibuv - Threads - Using Classes"
430 open_object(:MyThreads)
432 class MyThreads from ObjectControllerParent
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)
445 ? "Message from the First Thread!"
448 ? "Message from the Second Thread!"
455 Testing RingLibuv - Threads - Using Classes
456 Message from the First Thread!
457 Message from the Second Thread!
459 この拡張機能 (RingLibuv) の詳細情報は、この章をご確認ください: RingLibuv の用法