Ring 1.3 での変更点は?

Ring 1.3 公開版の変更点と新機能を学びます。

新機能と変更一覧

Ring 1.3 の新機能!

  • RingQt の改善
  • Ring ノートパッドの改善
  • Emacs Editor 用の Ring モード
  • StdLib の改善
  • Loop/Exit 命令の改善
  • 新しい関数
  • 参照による Self 返し
  • ‘from’ キーワードの代わりに‘<’または‘:’演算子の使用
  • Ring のステートを共有せずに Ring を組み込む
  • RingZip ライブラリ
  • フォームデザイナー

RingQt の改善

① QPixMap クラスの別バージョンとしてオブジェクトの初期化時に (int width,int height) を 扱う (QPixMap2) を追加しました。

用例:

Load "guilib.ring"
New qapp
{
        win1 =  new qwidget()
        {
                setwindowtitle("Drawing using QPixMap")
                setgeometry(100,100,500,500)
                label1 = new qlabel(win1)
                {
                        setgeometry(10,10,400,400)
                        settext("")
                }
                imageStock = new qlabel(win1)
                {
                        image = new qPixMap2(200,200)
                        color = new qcolor() {
                                setrgb(255,255,255,255)
                        }
                        pen = new qpen() {
                                setcolor(color)
                                setwidth(10)
                        }
                        new qpainter() {
                                begin(image)
                                        setpen(pen)
                                        drawline(0,0,200,200)
                                        drawline(200,0,0,200)
                                endpaint()
                        }
                        setpixmap(image)
                }
                show()
        }
        exec()
}

スクリーンショット:

QPixMap2 の使用

② この関数を実装するために、オブジェクトライブラリを更新しました。

  • Last_WindowID()
  • Open_WindowNoShow()
  • Open_WindowAndLink()

なお WindowViewBase クラス名は WindowsViewParent へ変更されました。

このコードの用例では Open_WindowAndLink() は SecondWindowController クラスからオブジェクトの作成を行い FirstWindowController クラスへ SecondWindow() メソッドを追加します。 また SecondWindowController クラスへ FirstWindow() メソッドを追加します。

FirstWindowController クラスにある SendMessage() メソッドは SecondWindow() メソッドでオブジェクトへアクセスするために使用できます。

class firstwindowController from windowsControllerParent

    oView = new firstwindowView

    func OpenSecondWindow
        Open_WindowAndLink(:SecondWindowController,self)

    func SendMessage
        if IsSecondWindow()
            SecondWindow().setMessage("Message from the first window")
        ok

    func setMessage cMessage
        oView.Label1.setText(cMessage)

③ このクラスを RingQt へ追加しました

  • QPixMap2
  • QScrollArea
  • QSplitter
  • QCompleter
  • QCompleter2
  • QCompleter3
  • QProcess
  • QMdiArea
  • QMdiSubWindow
  • QCursor
  • QListView
  • QDesktopServices

④ qt.rh には様々な定数が定義されています (guilib.ring により読み込み)

⑤ 新しいクラス名 - インデックスは 1 から開始します。

RingQt には新しいクラスが追加されています - 別バージョンのクラス名は小文字 “q” で開始されません。 また GUI コントロールなど扱うときにインデックスが 1 から開始するようにメソッドを更新してあります。

  • ComboBox
  • ListWidget
  • TableWidget
  • TreeWidget

これらのクラスは次のパッケージ名で提供されており guilib.ring の内部に存在します : System.GUI

使用するには

load "guilib.ring"

import System.GUI

これは以前のコードに一切影響を与えません。 つまり Ring の規則と整合性がある優れたコードに対する別の選択です。

またフォームデザイナーは、クラス間で「インデックスを 0 から開始」 または「インデックスを 1 から開始」を選択肢を使用するために更新しました。

用例 (フォームデザイナーを使用)

  1. https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/indexstart/indexstartView.ring
  2. https://github.com/ring-lang/ring/blob/master/applications/formdesigner/tests/indexstart/indexstartController.ring

Ring ノートパッドの改善

① QTextEdit の代わりに QPlainTextEdit を使用

② ソースコードの各行に対して行番号を表示

スクリーンショット:

Ring ノートパッド - 行番号

③ Ring 関数名、クラス、および開いているファイル語句の自動補完

Ring ノートパッド - 自動補完

④ 関数とメソッドのリスト

Ring ノートパッド - 関数リスト

⑤ 実行結果のウィンドウ

Ring ノートパッド - 実行結果ウィンドウ

⑥ クラスのリスト

Ring ノートパッド - クラスのリスト

⑦ 現在のスタイルを変更

Ring ノートパッド - スタイルメニュー

Emacs Editor 用の Ring モード

Ring 1.3 では Emacs Editor 用の Ring モードがあります。

スクリーンショット:

Emacs Editor 用の Ring モード

StdLib の改善

このような関数を StdLib へ実装するために更新しました。

  • SplitMany()
  • JustFilePath()
  • JustFileName()

Loop|Exit 命令の改善

Loop|Exit 命令は、命令 (数値に限りません) の後に式を受け入れるために更新しました。

文法:

Loop|Exit [数値]

変更後:

Loop|Exit []

用例:

XLoop = 2       # ループの外側
YLoop = 1       # 最初のループの内側
for x = 1 to 10
        for y = 1 to 10
                see "x=" + x + " y=" + y + nl
                if x = 3 and y = 5
                        exit XLoop
                ok
        next
next

新しい関数

  • PackageName() 関数
  • Swap() 関数

用例:

aList = [:one,:two,:four,:three]
see aList
see copy("*",50) + nl
swap(aList,3,4)
see aList

実行結果:

one
two
four
three
**************************************************
one
two
three
four

参照による Self 返し

この公開版では、クラスのメソッドで Self 返しを使用するとオブジェクトを返します。

用例:

mylist = [new mytest() {
        see self
        x = 20
        see self
}]

see mylist

class mytest
        x = 15
        func init
                return self     # 参照返し

実行結果:

x: 15.000000
x: 20.000000
x: 20.000000

‘from’キーワードの代わりに‘<’または‘:’演算子の使用

この公開版では‘from’キーワードの代わりに‘<’または‘:’演算子を使用できます。

文法①:

class Cat from Animal

文法②:

class Cat < Animal

文法③:

class Cat : Animal

Ring のステートを共有せずに Ring を組み込む

Ring 1.0 より Ring を C へ組み込むための関数は実装されていました。 また eval() 関数で Ring プログラム内で Ring のコードを実行できます。 この公開版ではステートを共有せずに Ring を Ring プログラムへ組み込むための関数を実装しました。

利点:

  • ① Ring プログラムとアプリケーションの統合で競合が発生しません。
  • ② Ring のコードを安全な環境で実行して、トレースを行うことができます。

用例:

pState = ring_state_init()
ring_state_runcode(pState,"See 'Hello, World!'+nl")
ring_state_runcode(pState,"x = 10")

pState2 = ring_state_init()
ring_state_runcode(pState2,"See 'Hello, World!'+nl")
ring_state_runcode(pState2,"x = 20")

ring_state_runcode(pState,"see x +nl")
ring_state_runcode(pState2,"see x +nl")

v1 = ring_state_findvar(pState,"x")
v2 = ring_state_findvar(pState2,"x")

see v1[3] + nl
see V2[3] + nl

ring_state_delete(pState)
ring_state_delete(pState2)

実行結果:

Hello, World!
Hello, World!
10
20
10
20

RingZip ライブラリ

Ring 1.3 には *.zip ファイルの作成、変更、および展開用の RingZip ライブラリがあります。

用例①: 四本のファイルがある myfile.zip を作成します。

load "ziplib.ring"
oZip = zip_openfile("myfile.zip",'w')
zip_addfile(oZip,"test.c")
zip_addfile(oZip,"zip.c")
zip_addfile(oZip,"zip.h")
zip_addfile(oZip,"miniz.h")
zip_close(oZip)

用例②: myfile.zip を myfolder フォルダへ展開します。

load "ziplib.ring"
zip_extract_allfiles("myfile.zip","myfolder")

用例③: myfile.zip にあるファイル名の一覧を表示します。

load "ziplib.ring"
oZip = zip_openfile("myfile.zip",'r')
for x=1 to zip_filescount(oZip)
       see zip_getfilenamebyindex(oZip,x) + nl
next
zip_close(oZip)

用例④: クラスの代わりに関数を使用します。

load "ziplib.ring"

new Zip {
        SetFileName("myfile.zip")
        Open("w")
        AddFile("test.c")
        AddFile("zip.c")
        AddFile("zip.h")
        AddFile("miniz.h")
        Close()
}

フォームデザイナー

Ring 1.3 では GUI アプリケーション・フォームの手軽な設計、および Ring ソースコードの生成を行うためのフォームデザイナーが付属しています。

オブジェクト指向プログラミングとメタプログラミングを使用した 約 8000 行の Ring コードで記述しました。

Ring ノートパッドからフォームデザイナーを実行できます。

フォームデザイナー - Ring ノートパッドの内面図

また、別のウィンドウからフォームデザイナーを実行することもできます。

フォームデザイナー