入れ子構造を使用した宣言型プログラミング

最先端のオブジェクト指向である入れ子構造を使用した宣言型プログラミング環境の構築方法を学びます。

  • リスト内へオブジェクトを作成するには
  • コンポジションと参照によりオブジェクトとリストを返すには
  • オブジェクトのアクセス完了後にコードを実行するには
  • 最先端のオブジェクト指向による宣言型プログラミング

リスト内へオブジェクトを作成するには

リストの定義時にリスト内へオブジェクトを作成できます。 Add() 関数、または + 演算子により、必要なときにオブジェクトをリストへ追加できます。

用例:

alist = [new point, new point, new point]       # # 三つのオブジェクトを有するリストを作成します。

alist + [1,2,3]                                 # 別の項目をリストへ追加します。

see "Item 4 is a list contains 3 items" + nl
see alist[4]

add(alist , new point)
alist + new point

alist[5] { x = 100 y = 200 z = 300 }
alist[6] { x = 50 y = 150 z = 250 }

see "Object inside item 5" + nl
see alist[5]
see "Object inside item 6" + nl
see alist[6]

class point x y z

実行結果:

Item 4 is a list contains 3 items
1
2
3
Object inside item 5
x: 100.000000
y: 200.000000
z: 300.000000
Object inside item 6
x: 50.000000
y: 150.000000
z: 250.000000

コンポジションと参照によりオブジェクトとリストを返すには

コンポジションの使用、およびクラスの属性としてオブジェクトを有しているとき、オブジェクトを返す場合は参照により返されます。

呼び出し元が代入演算子を使用した場合は、オブジェクトの別のコピーが作成されます。

呼び出し元で代入演算子の使用を避けると、返された参照はオブジェクトへ直接アクセスするために使用できます。

属性がリスト (オブジェクトではありません) ならば同じ処理が適用されます。

注釈

オブジェクト、およびリストは同じ規則を使用して処理されます。 関数へ渡されるときは参照渡しになります。 関数から返すときは参照により返されるオブジェクトの属性を除き、値により返されます。

用例:

o1 = new Container
myobj = o1.addobj()     # 代入により別のコピーを作成します。
myobj.x = 100
myobj.y = 200
myobj.z = 300
see o1.aobjs[1]         # コンテナ内にあるにオブジェクトを表示します。
see myobj               # コピーの表示

Class Container
        aObjs = []
        func addobj
                aobjs + new point
                return aobjs[len(aobjs)]        # 参照によりオブジェクトを返します。

Class point
        x  = 10
        y  = 20
        z  = 30

実行結果:

x: 10.000000
y: 20.000000
z: 30.000000
x: 100.000000
y: 200.000000
z: 300.000000

用例②:

func main
        o1 = new screen  {
                content[point()] {
                        x = 100
                        y = 200
                        z = 300
                }
                content[point()] {
                        x = 50
                        y = 150
                        z = 250
                }
        }
        see o1.content[1]
        see o1.content[2]

Class Screen
        content = []
        func point
                content + new point
                return len(content)

Class point
        x  = 10
        y  = 20
        z  = 30

実行結果:

x: 100.000000
y: 200.000000
z: 300.000000
x: 50.000000
y: 150.000000
z: 250.000000

用例③:

func main
        o1 = New Screen  {
                point() {               # 参照を使用してオブジェクトへアクセスします。
                        x = 100
                        y = 200
                        z = 300
                }
                point() {               # 参照を使用してオブジェクトへアクセスします。
                        x = 50
                        y = 150
                        z = 250
                }
        }
        see o1.content[1]
        see o1.content[2]

Class Screen
        content = []
        func point
                content + new point
                return content[len(content)]    # 参照によりオブジェクトを返します。

Class point x=10 y=20 z=30

実行結果:

x: 100.000000
y: 200.000000
z: 300.000000
x: 50.000000
y: 150.000000
z: 250.000000

オブジェクトのアクセス完了後にコードを実行するには

オブジェクトの属性とメソッドを使用するには { } でオブジェクトへアクセスします。

オブジェクトに BraceEnd() メソッドがある場合は、オブジェクトのアクセス完了直前に実行されます。

用例:

New Point { See "How are you?" + nl }

Class Point x y z
        func braceend
                see "I'm fine, Thank you!" + nl

実行結果:

How are you?
I'm fine, Thank you!

最先端のオブジェクト指向による宣言型プログラミング

この機能は最先端のオブジェクト指向である入れ子構造を使用した 宣言型プログラミング環境の構築と使用を可能にします。

  • { } によるオブジェクトの属性、およびメソッドへのアクセス
  • BraceEnd() メソッド
  • 参照によるオブジェクト返し
  • Setter (セッター) / Getter (ゲッター) メソッド (オプション扱い)

用例:

# 宣言型プログラミング (入れ子構造)

Screen()
{

        point()
        {
                x = 100
                y = 200
                z = 300
        }

        point()
        {
                x = 50
                y = 150
                z = 250
        }
}

# 関数とクラス

Func screen return new screen

Class Screen

        content = []

        func point
                content + new point
                return content[len(content)]

        func braceend
                see "I have " + len(content) + " points!"

Class point

        x=10 y=20 z=30

        func braceend
                see self

実行結果:

x: 100.000000
y: 200.000000
z: 300.000000
x: 50.000000
y: 150.000000
z: 250.000000
I have 2 points!

さらに美しいコードへ

メソッドで仮引数を扱わないときは、メソッド名の後に () の記述を省略できるため、 より良い結果、より優れたコードになります。 この機能はオブジェクトのメソッド、およびオブジェクトの属性との間に違いがあるため Ring によって直接提供されていません。 オブジェクトの属性へ Getter メソッドを定義するときにコードのシンタックスで類似の作用を得ることができます。 例えば point() メソッドを定義する代わりに point 属性の値を取得すると実行される getpoint() メソッドを point 属性として定義します。変数名は () を付けずに直接記述でき、 point() の代わりに point と記述できるため、 getpoint() メソッドはオブジェクトの作成、およびオブジェクトの参照を返します。

用例:

new Container
{
        Point
        {
                x=10
                y=20
                z=30
        }
}

Class Container
        aObjs = []
        point
        func getpoint
                aObjs + new Point
                return aObjs[len(aObjs)]

Class Point x y z
        func braceend
                see "3D Point" + nl + x + nl + y + nl + z + nl

実行結果:

3D Point
10
20
30