SymOntoClay is game AI experimental open source engine.


  Warning logo Purely experimental and very unstable project developed by only one person
Please read the page before starting

Code examples

Contens

Hello world!

back to top

Download
app PeaceKeeper
{
    on Enter =>
    {
        "Begin" >> @>log;
        "End" >> @>log;
    }
}

Enter life cycle trigger is executed. Strings are wrritten into log channel.

Begin
End

Comments

back to top

Single line comment

back to top

Read more about Single line comment here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        "Begin" >> @>log;
        //@r = @b = 1;
        @bx >> @>log;
        "End" >> @>log;
    }
}
Begin
NULL
End

Multi line comment

back to top

Read more about Multi line comment here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        "Begin" >> @>log;
        /*@r = @b = 1;
        @bx >> @>log;*/
        "End" >> @>log;
    }
}
Begin
End

NULL

Read more about NULL here.

Download
app Example
{
    on Enter =>
    {
        'Begin' >> @>log;
        @x = NULL;
        @x >> @>log;
        'End' >> @>log;
    }
}
Begin
NULL
End

Variables

back to top

Read more about Variables here.

Example 1

back to top

Here 1 is alternately assigned to variables @r and @b. So the variable @b will contain 1.

Download
app PeaceKeeper
{
    on Enter =>
    {
        "Begin" >> @>log;
        @r = @b = 1;
        @b >> @>log;
        "End" >> @>log;
    }
}
Begin
1
End

Example 2

back to top

A variable @bx has never been being assigned. So It contains default value NULL.

Download
app PeaceKeeper
{
    on Enter =>
    {
        "Begin" >> @>log;
        @r = @b = 1;
        @bx >> @>log;
        "End" >> @>log;
    }
}
Begin
NULL
End

Example 3

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        var @a: number = 2;
        @a >> @>log;
        var @b: number;
        @b >> @>log;
        var @c;
        @c >> @>log;
        'End' >> @>log;
    }
}
Begin
2
NULL
NULL
End

Object literal

back to top

Read more about Object literal here.

Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
            var @a = {
            @b = 1;
        };
        @a.@b >> @>log;
        'End' >> @>log;
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
            var @a = {
            @b = 1;
        };
        @a.@b = 2;
        @a.@b >> @>log;
        'End' >> @>log;
    }
}
Begin
2
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        var @c = SomeFun();
        @c.@b >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
            var @a = {
            @b = 1;
        };
        return @a;
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        SomeFun().@b >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
            var @a = {
            @b = 1;
        };
        return @a;
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
            OtherFun({
            @b = 1;
        });
        'End' >> @>log;
    }
    fun OtherFun(@param)
    {
        @param.@b >> @>log;
    }
Begin
1
End

Linguistic variable

back to top

Read more about Linguistic variable here.

Full declaration

back to top

Download
linvar age for range (0, 150]
{
    constraints:
        for inheritance;
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
Download
linvar logic for range [0, 1]
{
    constraints:
        for inheritance;
    terms:
        minimal = L(0, 0.1);
        low = Trapezoid(0, 0.05, 0.3, 0.45);
        middle = Trapezoid(0.3, 0.4, 0.6, 0.7);
        high = Trapezoid(0.55, 0.7, 0.95, 1);
        maximal = S(0.9, 1);
}

Minimal declaration

back to top

Download
linvar age
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
Download
linvar age
{
    `teenager` = Trapezoid(10, 12, 17, 20);
}

With ranges

back to top

Download
linvar age for range (-∞, +∞)
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}

This range is also from negative infinity to positive infinity:

Download
linvar age for range (*, *)
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}

This range is open.

Download
linvar age for range (0, 150)
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}

This range is closed.

Download
linvar age for range [0, 150]
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}

This range is left-open and right-closed.

Download
linvar age for range (0, 150]
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}

This range is left-closed and right-open.

Download
linvar age for range [0, 150)
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}

With constraints

back to top

Download
linvar age
{
    constraints:
        for inheritance;
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
Download
linvar age
{
    constraints:
        for inh;
        for rel age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
Download
linvar age for range (0, 150]
{
    constraints:
        for rel age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
Download
linvar age for range (0, 150]
{
    constraints:
        for inheritance;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
Download
linvar age for range (0, 150]
{
    constraints:
        for inh;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}

Predefined membership functions

back to top

L Function

back to top

Download
linvar age for range (0, 150]
{
    `teenager` = L(5, 10);
}

Trapezoid Function

back to top

Download
linvar age for range (0, 150]
{
    `teenager` = Trapezoid(10, 12, 17, 20);
}

S Function

back to top

Download
linvar age for range (0, 150]
{
    `teenager` = S(12, 17, 22);
}
Download
linvar age for range (0, 150]
{
    `teenager` = S(12, 22);
}

Synonym

back to top

Read more here about synonyms in SymOntoClay DSL.

Download
synonym b for a;
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        b();
        'End' >> @>log;
    }
}
Begin
`a` has been called!
End
Download
synonym param_1 for param_2;
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a(param_2: 1);
        'End' >> @>log;
    }
}
Begin
`a` has been called!
1
End
Download
synonym procreator for parent;
app PeaceKeeper
{
    {: male(#Tom) :}
    {: procreator(#Piter, #Tom) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
        on Enter => {
        select {: son($x, $y) :} >> @>log;
    }
}
<yes>
$y = #piter; $x = #tom
Download
synonym procreator for parent;
synonym #Tom for #Person123;
app PeaceKeeper
{
    {: male(#Tom) :}
    {: procreator(#Piter, #Person123) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
        on Enter => {
        select {: son($x, $y) :} >> @>log;
    }
}
<yes>
$y = #piter; $x = #tom
Download
synonym go for walk;
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        walk();
        'End' >> @>log;
    }
}
action Go
{
    on Enter =>
    {
        'Enter Go' >> @>log;
    }
    op () =>
    {
        'Begin Go' >> @>log;
        'End Go' >> @>log;
    }
}
Begin
Enter Go
Begin Go
End Go
End
Download
synonym Chilling for Idling;
app PeaceKeeper
{
    set Chilling as default state;
    on Enter =>
    {
        'Begin' >> @>log;
        'End' >> @>log;
    }
}
state Idling
{
    on Enter
    {
        'Begin Enter' >> @>log;
        'End Enter' >> @>log;
    }
}
Begin
Begin Enter
End
End Enter

Inheritance

back to top

Here It is example of changing relationship run time using operator "is" and statement "set is".

Read more here about inheritance in SymOntoClay DSL.

Download
app PeaceKeeper is [0.5] exampleClass
{
    on Enter =>
    {
        "Begin" >> @>log;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set exampleClass is [0.5] human;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set exampleClass is not human;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set @@self is linux;
        @@self is linux >> @>log;
        "End" >> @>log;
    }
}
Begin
0
1
0.5
0.5
0.5
0.5
0
End

Using non-numeric fuzzy value:

Download
linvar logic for range [0, 1]
{
    constraints:
        for inheritance;
    terms:
        minimal = L(0, 0.1);
        low = Trapezoid(0, 0.05, 0.3, 0.45);
        middle = Trapezoid(0.3, 0.4, 0.6, 0.7);
        high = Trapezoid(0.55, 0.7, 0.95, 1);
        maximal = S(0.9, 1);
}
app PeaceKeeper is [middle] exampleClass
{
    on Enter =>
    {
        'Begin' >> @>log;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set exampleClass is [middle] human;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set exampleClass is not human;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set @@self is linux;
        @@self is linux >> @>log;
        'End' >> @>log;
    }
}
Begin
0
1
0.5
0.5
0.5
0.5
0
End
Download
linvar logic for range [0, 1]
{
    constraints:
        for inheritance;
    terms:
        minimal = L(0, 0.1);
        low = Trapezoid(0, 0.05, 0.3, 0.45);
        middle = Trapezoid(0.3, 0.4, 0.6, 0.7);
        high = Trapezoid(0.55, 0.7, 0.95, 1);
        maximal = S(0.9, 1);
}
app PeaceKeeper is [very middle] exampleClass
{
    on Enter =>
    {
        'Begin' >> @>log;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set exampleClass is [very middle] human;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set exampleClass is not human;
        exampleClass is human >> @>log;
        exampleClass is not human >> @>log;
        set @@self is linux;
        @@self is linux >> @>log;
        'End' >> @>log;
    }
}
Begin
0
1
0.5
0.5
0.5
0.5
0
End

Additional settings

back to top

Read more about Additional settings here.

Priority

back to top

Read more about Priority here.

Download
app PeaceKeeper
{
    fun a() with priority = 1 =>
    {
        '`a` has been called!' >> @>log;
        @a = 10;
        while (@a > 0)
        {
            @a >> @>log;
            @a = @a - 1;
        }
        'End `a`' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @a = a~~();
        wait @a;
        'End' >> @>log;
    }
}
Download
app PeaceKeeper
{
    on {: see(I, #a) :} with priority 1 =>
    {
        'D' >> @>log;
    }
}
Download
app PeaceKeeper
{
    on {: see(I, #a) :} as `trigger 1` alias `Alarm trigger`, trigger_5 with priority 1 =>
    {
        'D' >> @>log;
    }
}
Download
app PeaceKeeper
{
    on {: see(I, #a) :} as `trigger 1` with priority 1 =>
    {
        'D' >> @>log;
    }
}
Download
app PeaceKeeper
{
    on {: see(I, $x) :}($x >> @x) with priority 1 =>
    {
        'on Fired $x in App' >> @>log;
        @x >> @>log;
    }
}

Member access modifiers

back to top

Read more about Member access modifiers here.

Download
class Cls1
{
    protected:
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
}
app PeaceKeeper is Cls1
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        a();
        'End' >> @>log;
    }
}
Begin
`a` has been called!
End
Download
class Cls1
{
    private:
    {: male(#Tom) :}
    {: parent(#Piter, #Tom) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
}
app PeaceKeeper is Cls1
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        select {: son($x, $y) :} >> @>log;
        'End' >> @>log;
    }
}
Begin
<no>
End
Download
class Cls1
{
    protected:
    {: male(#Tom) :}
    {: parent(#Piter, #Tom) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
}
app PeaceKeeper is Cls1
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        select {: son($x, $y) :} >> @>log;
        'End' >> @>log;
    }
}
Begin
<yes>
$y = #piter; $x = #tom
End

Field

back to top

Read more about Field here.

Download
app PeaceKeeper
{
    @b;
    on Enter =>
    {
        'Begin' >> @>log;
        @b >> @>log;
        'End' >> @>log;
    }
}
Begin
NULL
End
Download
app PeaceKeeper
{
    var @b: number = 2;
    on Enter =>
    {
        'Begin' >> @>log;
        @b >> @>log;
        'End' >> @>log;
    }
}
Begin
2
End

Property

back to top

Read more about Property here.

Auto property

back to top

Read more about Auto property here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        SomeAutoProp >> @>log;
        'End' >> @>log;
    }
    prop SomeAutoProp: number = 16;
}
Begin
16
End
Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        SomeAutoProp >> @>log;
        'End' >> @>log;
    }
    SomeAutoProp: number = 16;
}
Begin
16
End
Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        SomeAutoProp >> @>log;
        'End' >> @>log;
    }
    prop SomeAutoProp = 16;
}
Begin
16
End
Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        SomeAutoProp >> @>log;
        'End' >> @>log;
    }
    SomeAutoProp;
}
Begin
NULL
End

Read-only property

back to top

Read more about Read-only property here.

Download
app PeaceKeeper
{
    var @b: number = 2;
    on Enter =>
    {
        'Begin' >> @>log;
        SomeGetProp >> @>log;
        'End' >> @>log;
    }
    prop SomeGetProp: number => @b;
}
Begin
2
End

Constructor

back to top

Read more about Constructor here.

Download
class cls0
{
    ctor(@param: string)
    {
        'Begin ctor 1 of cls0' >> @>log;
        @param >> @>log;
        @b >> @>log;
        'End ctor 1 of cls0' >> @>log;
    }
    ctor(@param: number)
    {
        'Begin ctor 2 of cls0' >> @>log;
        @param >> @>log;
        @b >> @>log;
        'End ctor 2 of cls0' >> @>log;
    }
    private:
    @b = 0;
}
class cls1 is cls0
{
    ctor(@param: string)
    : cls0('Cool!')
    {
        'Begin ctor of cls1' >> @>log;
        @param >> @>log;
        @b >> @>log;
        'End ctor of cls1' >> @>log;
    }
    private:
    @b = 1;
}
class cls2 is cls0
{
    ctor(@param: number)
    : cls0(16)
    {
        'Begin ctor of cls2' >> @>log;
        @param >> @>log;
        @b >> @>log;
        'End ctor of cls2' >> @>log;
    }
    private:
    @b = 2;
}
app PeaceKeeper is cls1, cls2
{
    ctor()
    : ('Hi')
    {
        'Begin ctor 1 of PeaceKeeper' >> @>log;
        @b >> @>log;
        'End ctor 1 of PeaceKeeper' >> @>log;
    }
    ctor(@param: string)
    : cls1('The Beatles!'),
    cls2(12)
    {
        'Begin ctor 2 of PeaceKeeper' >> @>log;
        @param >> @>log;
        @b >> @>log;
        'End ctor 2 of PeaceKeeper' >> @>log;
    }
    private:
    @b = 3;
}
Begin ctor 1 of cls0
Cool!
0
End ctor 1 of cls0
Begin ctor of cls1
The Beatles!
1
End ctor of cls1
Begin ctor 2 of cls0
16
0
End ctor 2 of cls0
Begin ctor of cls2
12
2
End ctor of cls2
Begin ctor 2 of PeaceKeeper
Hi
3
End ctor 2 of PeaceKeeper
Begin ctor 1 of PeaceKeeper
3
End ctor 1 of PeaceKeeper

Function and Method

back to top

Read more about Function here.

Read more about Method here.

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a();
        'End' >> @>log;
    }
}
Begin
`a` has been called!
End
Download
app PeaceKeeper
{
    fun a()
    {
        '`a` has been called!' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a();
        'End' >> @>log;
    }
}
Begin
`a` has been called!
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a(1);
        'End' >> @>log;
    }
}
Begin
`a` has been called!
1
End
Download
fun a(@param_1)
{
    '`a` (any) has been called!' >> @>log;
    @param_1 >> @>log;
}
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        a(param_1: 1);
        'End' >> @>log;
    }
}
Begin
`a` (any) has been called!
1
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a(@param_1: 1);
        'End' >> @>log;
    }
}
Begin
`a` has been called!
1
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a(param_1: 1);
        'End' >> @>log;
    }
}
Begin
`a` has been called!
1
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @param_1 = 12;
        a(@param_1);
        'End' >> @>log;
    }
}
Begin
`a` has been called!
12
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` (1) has been called!' >> @>log;
        @param_1 >> @>log;
    }
    fun a(@param_1, @param_2)
    {
        '`a` (2) has been called!' >> @>log;
        @param_1 >> @>log;
        @param_2 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @param_1 = 12;
        a(@param_1);
        'End' >> @>log;
    }
}
Begin
`a` (1) has been called!
12
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` (1) has been called!' >> @>log;
        @param_1 >> @>log;
    }
    fun a(@param_1, @param_2)
    {
        '`a` (2) has been called!' >> @>log;
        @param_1 >> @>log;
        @param_2 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @param_1 = 12;
        a(@param_1);
        a(3, 'Hi');
        'End' >> @>log;
    }
}
Begin
`a` (1) has been called!
12
`a` (2) has been called!
3
Hi
End
Download
app PeaceKeeper
{
    fun a(@param_1, @param_2 = 15)
    {
        '`a` (2) has been called!' >> @>log;
        @param_1 >> @>log;
        @param_2 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @param_1 = 12;
        a(@param_1);
        'End' >> @>log;
    }
}
Begin
`a` (2) has been called!
12
15
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` (any) has been called!' >> @>log;
    }
    fun a(@param_1: string)
    {
        '`a` (string) has been called!' >> @>log;
    }
    fun a(@param_1: number)
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a(param_1: 1);
        'End' >> @>log;
    }
}
Begin
`a` has been called!
1
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` (any) has been called!' >> @>log;
        @param_1 >> @>log;
    }
    fun a(@param_1: (number | string))
    {
        '`a` (number | string) has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a(param_1: 1);
        a(param_1: 'Hi');
        'End' >> @>log;
    }
}
Begin
`a` (number | string) has been called!
1
`a` (number | string) has been called!
Hi
End
Download
app PeaceKeeper
{
    fun a(@param_1)
    {
        '`a` (any) has been called!' >> @>log;
        @param_1 >> @>log;
    }
    fun a(@param_1: number | string)
    {
        '`a` (number | string) has been called!' >> @>log;
        @param_1 >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a(param_1: 1);
        a(param_1: 'Hi');
        'End' >> @>log;
    }
}
Begin
`a` (number | string) has been called!
1
`a` (number | string) has been called!
Hi
End
Download
app PeaceKeeper
{
    on Enter
    {
        fun SomeFun()
        {
            return 1;
        }
        'Begin' >> @>log;
        SomeFun() >> @>log;
        'End' >> @>log;
    }
Begin
1
End

Function as a first order object

back to top

Read more about Function here.

Read more about Method here.

Read more about Anonymous function here.

Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = fun()
        {
            return 1;
        };
        @a() >> @>log;
        'End' >> @>log;
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        fun()
        {
            return 1;
        }() >> @>log;
        'End' >> @>log;
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = SomeFun();
        @a() >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
        return fun()
        {
            return 1;
        };
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = OtherFun(SomeFun());
        @a >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
        return fun()
        {
            return 1;
        };
    }
    fun OtherFun(@param)
    {
        return @param();
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = OtherFun(param: SomeFun());
        @a >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
        return fun()
        {
            return 1;
        };
    }
    fun OtherFun(@param)
    {
        return @param();
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = OtherFun(@param: SomeFun());
        @a >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
        return fun()
        {
            return 1;
        };
    }
    fun OtherFun(@param)
    {
        return @param();
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = OtherFun(fun()
        {
            return 1;
        });
        @a >> @>log;
        'End' >> @>log;
    }
    fun OtherFun(@param)
    {
        return @param();
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        SomeFun()() >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
        return fun()
        {
            return 1;
        };
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        SomeFun()() >> @>log;
        'End' >> @>log;
    }
    fun SomeFun()
    {
        @a = 2;
        return fun()
        {
            return @a + 1;
        };
    }
Begin
3
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        SomeFun(2)() >> @>log;
        'End' >> @>log;
    }
    fun SomeFun(@a)
    {
        return fun()
        {
            return @a + 1;
        };
    }
}
Begin
3
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        OtherFun()() >> @>log;
        'End' >> @>log;
    }
    fun OtherFun()
    {
        return SomeFun;
    }
    fun SomeFun()
    {
        return 1;
    }
}"
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        OtherFun(SomeFun);
        'End' >> @>log;
    }
    fun OtherFun(@fn)
    {
        @fn() >> @>log;
    }
    fun SomeFun()
    {
        return 1;
    }
}
Begin
1
End

Idle actions

back to top

Read more here about Idle actions.

Download
app PeaceKeeper
{
    idle actions
    {
        go();
    }
    fun go()
    {
        'GO()' >> @>log;
        wait 10;
    }
}
GO()
Download
app PeaceKeeper
{
    idle actions
    {
        go()[: timeout=1 :];
    }
    fun go()
    {
        'GO()' >> @>log;
        wait 10;
    }
}
GO()
GO()
GO()
GO()
GO()
Download
app PeaceKeeper
{
    idle actions
    {
        {: >: { direction($x1,#@(place & color = green)) & $x1 = go(someone,self) } o: 1 :};
    }
    fun go(@direction)
    {
        'GO()' >> @>log;
        @direction >> @>log;
        wait 10;
    }
}
Download
app PeaceKeeper
{
    idle actions
    {
        {: >: { direction($x1,#@(place & color = green)) & $x1 = go(someone,self) } o: 1 :}[: timeout=1 :];
    }
    fun go(@direction)
    {
        'GO()' >> @>log;
        wait 10;
    }
}

Action

back to top

Read more here about Action.

Read more here about Function call overloading.

Read more here about "complete action" statement.

Read more here about "break action" statement.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        Go();
        'End' >> @>log;
    }
}
action Go
{
    on Enter =>
    {
        'Enter Go' >> @>log;
    }
    op () =>
    {
        'Begin Go' >> @>log;
        'End Go' >> @>log;
    }
    on {: see(I, $x) :} ($x >> @x) =>
    {
        'on Fired' >> @>log;
        @x >> @>log;
        complete action;
    }
}
Begin
Enter Go
Begin Go
End Go
End
Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        Go();
        'End' >> @>log;
    }
}
action Go
{
    on Enter =>
    {
        'Enter Go' >> @>log;
    }
    on Leave
    {
        'Leave Go' >> @>log;
    }
    op () =>
    {
        'Begin Go' >> @>log;
        'End Go' >> @>log;
    }
}
Begin
Enter Go
Begin Go
End Go
Leave Go
End
Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        Go();
        'End' >> @>log;
    }
}
action Go
{
    op () =>
    {
        'Begin Go' >> @>log;
        @a = 10;
        repeat
        {
            @a >> @>log;
            @a = @a - 1;
            a()[:on complete { complete action; } :];
            if(@a > 5)
            {
                continue;
            }
            'End of while iteration' >> @>log;
            break;
        }
        'End Go' >> @>log;
    }
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
}
Begin
Begin Go
10
`a` has been called!
End

Read more here about Annotation complete event.

State

back to top

Read more here about State.

Download
app PeaceKeeper
{
    set Idling as default state;
    on Enter =>
    {
        'Begin' >> @>log;
        'End' >> @>log;
    }
}
states { Idling, Attacking }
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        'End Idling Enter' >> @>log;
    }
}
state Attacking
{
    enter on:
    {: see(I, enemy) :}
    leave on:
    {: see(I, barrel) :}
    on Enter
    {
        'Begin Attacking Enter' >> @>log;
        'End Attacking Enter' >> @>log;
    }
}
Begin
Begin Idling Enter
End
End Idling Enter
Download
app PeaceKeeper
{
    set Idling as state;
    on Enter =>
    {
        'Begin' >> @>log;
        'End' >> @>log;
    }
}
state Idling
{
    on Enter
    {
        'Begin Enter' >> @>log;
        'End Enter' >> @>log;
    }
}
Begin Enter
Begin
End Enter
End
Download
app PeaceKeeper
{
    set Idling as default state;
    set Patrolling as state;
    on Enter =>
    {
        'Begin' >> @>log;
        'End' >> @>log;
    }
}
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        'End Idling Enter' >> @>log;
    }
}
state Patrolling
{
    on Enter
    {
        'Begin Patrolling Enter' >> @>log;
        set Idling as state;
        'End Patrolling Enter' >> @>log;
    }
}
Begin Patrolling Enter
Begin
Begin Idling Enter
End
End Idling Enter
Download
app PeaceKeeper
{
    set Patrolling as state;
}
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        'End Idling Enter' >> @>log;
    }
}
state Patrolling
{
    on Enter
    {
        'Begin Patrolling Enter' >> @>log;
        set Idling as default state;
        complete state;
        'End Patrolling Enter' >> @>log;
    }
}
Begin Patrolling Enter
Begin Idling Enter
End Idling Enter
Download
app PeaceKeeper
{
    set Idling as default state;
    set Patrolling as state;
    on Enter =>
    {
        'Begin' >> @>log;
        'End' >> @>log;
    }
    on {: attack(I, enemy) :}
    {
        'D' >> @>log;
    }
}
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        'End Idling Enter' >> @>log;
    }
}
state Patrolling
{
    on Enter
    {
        'Begin Patrolling Enter' >> @>log;
        break state {: attack(I, enemy) :};
        'End Patrolling Enter' >> @>log;
    }
}
Begin
Begin Patrolling Enter
End
Begin Idling Enter
End Idling Enter
D
Download
app PeaceKeeper
{
    set Idling as default state;
    set Patrolling as state;
    on Enter =>
    {
        'Begin' >> @>log;
        'End' >> @>log;
    }
    on {: attack(I, enemy) :}
    {
        'D' >> @>log;
    }
}
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        'End Idling Enter' >> @>log;
    }
}
state Patrolling
{
    on Enter
    {
        'Begin Patrolling Enter' >> @>log;
        break state;
        'End Patrolling Enter' >> @>log;
    }
}
Begin Patrolling Enter
Begin
End
Begin Idling Enter
End Idling Enter
Download
app PeaceKeeper
{
    set Idling as default state;
    {: male(#Tom) :}
    {: parent(#Piter, #Tom) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
}
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        select {: son($x, $y) :} >> @>log;
        'End Idling Enter' >> @>log;
    }
}
Begin Idling Enter
<yes>
$y = #piter; $x = #tom
End Idling Enter
Download
app PeaceKeeper
{
    set Idling as default state;
    on Enter =>
    {
        'Begin' >> @>log;
        select {: son($x, $y) :} >> @>log;
        'End' >> @>log;
    }
}
state Idling
{
    {: male(#Tom) :}
    {: parent(#Piter, #Tom) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        'End Idling Enter' >> @>log;
    }
}
Begin
Begin Idling Enter
End Idling Enter
<no>
End
Download
app PeaceKeeper
{
    set Idling as default state;
}
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        ? {: bird ($x) :} >> @>log;
        insert {: >: { bird (#1234) } :};
        ? {: bird ($x) :} >> @>log;
        'End Idling Enter' >> @>log;
    }
}
Begin Idling Enter
<no>
<yes>
$x = #1234
End Idling Enter
Download
app PeaceKeeper
{
    set Idling as default state;
    set Patrolling as state;
    on Enter =>
    {
        'Begin' >> @>log;
        'End' >> @>log;
    }
}
state Idling
{
    on Enter
    {
        'Begin Idling Enter' >> @>log;
        'End Idling Enter' >> @>log;
    }
}
state Patrolling
{
    on Enter
    {
        'Begin Patrolling Enter' >> @>log;
        set Idling as state;
        'End Patrolling Enter' >> @>log;
    }
    on Leave
    {
        'Begin Patrolling Leave' >> @>log;
        'End Patrolling Leave' >> @>log;
    }
}
Begin
Begin Patrolling Enter
End
Begin Patrolling Leave
Begin Idling Enter
End Patrolling Leave
End Idling Enter

Calling method

back to top

Read more here about Calling method.

You can see other examples here.

Synchronous

back to top

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a();
        'End' >> @>log;
    }
}
Begin
`a` has been called!
End

Asynchronous

back to top

Child asynchronous call

back to top

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
    on Enter =>
    {
        a~();
        wait 1;
    }
}
`a` has been called!

Independent asynchronous call

back to top

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
    on Enter =>
    {
        a~~();
    }
}
`a` has been called!

Cancelation

back to top

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
        @a = 10;
        while (@a > 0)
        {
            @a >> @>log;
            @a = @a - 1;
        }
        'End `a`' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @a = a~~();
        @a.cancel();
        'End' >> @>log;
    }
}
Begin
`a` has been called!
End

Timeout

back to top

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
        wait 10;
        'End `a`' >> @>log;
    }
    fun b() =>
    {
        '`b` has been called!' >> @>log;
        wait 10;
        'End `b`' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @a = a~~()[: timeout = 1 :];
        @b = b~~()[: timeout = 1 :];
        wait @a, @b;
        'End' >> @>log;
    }
}
Begin
`a` has been called!
`b` has been called!
End

Calling host method

back to top

Read more here about Host.

In details writing a Host endpoint is described here.

Read more here about calling methods.

Synchronous

back to top

Download
app PeaceKeeper is [0.5] exampleClass
{
    on Enter =>
    {
        "Begin" >> @>log;
        @@host.`go`(to: #@[25, 30]);
        "End" >> @>log;
    }
}
Begin

Asynchronous

back to top

Download
app PeaceKeeper is [0.5] exampleClass
{
    on Enter =>
    {
        "Begin" >> @>log;
        @@host.`go`~~(to: #@[25, 30]);
        "End" >> @>log;
    }
}
Begin
End
methodName = 'go'
#020ED339-6313-459A-900D-92F809CEBDC5>>14-11-2022 20:09:18.90812 SymOntoClay.CLI.CLIRunHandler GenericCall LOG methodName = 'go'
isNamedParameters = True
#020ED339-6313-459A-900D-92F809CEBDC5>>14-11-2022 20:09:18.90986 SymOntoClay.CLI.CLIRunHandler GenericCall LOG isNamedParameters = True
namedParameters = {
"to": "#@[25, 30]"
}
#020ED339-6313-459A-900D-92F809CEBDC5>>14-11-2022 20:09:18.93094 SymOntoClay.CLI.CLIRunHandler GenericCall LOG namedParameters = {
"to": "#@[25, 30]"
}
positionedParameters = null
#020ED339-6313-459A-900D-92F809CEBDC5>>14-11-2022 20:09:18.93186 SymOntoClay.CLI.CLIRunHandler GenericCall LOG positionedParameters = null

Logic queries

back to top

Example 1

back to top

Read more about operator "select" here.

Read more about facts here.

Read more about logic rule here.

Download
class exampleClass is human, [0.1] animal
{
    {: male(#Tom) :}
    {: parent(#Piter, #Tom) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
    {: { love($x, $y) } -> { help($x, $y) } :}
}
app PeaceKeeper is [0.5] exampleClass
{
    on Enter =>
    {
        "Begin" >> @>log;
        select {: son($x, $y) :} >> @>log;
        "End" >> @>log;
    }
}

The result of this query:

Begin
<yes>
$y = #piter; $x = #tom
End
Download
class exampleClass is human, [0.1] animal
{
    {: male(#Tom) :}
    {: parent(#Piter, #Tom) :}
    {: {son($x, $y)} -> { male($x) & parent($y, $x)} :}
    {: { love($x, $y) } -> { help($x, $y) } :}
}
app PeaceKeeper is [0.5] exampleClass
{
    on Enter =>
    {
        "Begin" >> @>log;
        ? {: son($x, $y) :} >> @>log;
        "End" >> @>log;
    }
}

The result of this query:

Begin
<yes>
$y = #piter; $x = #tom
End

Example 2

back to top

Read more about operator "select" here.

Read more about facts here.

Read more about logic rule here.

Using inheritance in logic searching.

Read more here about inheritance in SymOntoClay DSL.

For set of facts:

{: can(bird, fly) :}
{: bird(#Alisa_12) :}
Download
app PeaceKeeper
{
    {: can(bird, fly) :}
    {: bird(#Alisa_12) :}
    on Enter =>
    {
        ? {: can(#Alisa_12, $x) :} >> @>log;
    }
}

The query:

{: can(#Alisa_12, $x) :}

returns:

<yes>
$x = fly

The query:

{: can(#Alisa_12, fly) :}
Download
app PeaceKeeper
{
    {: can(bird, fly) :}
    {: bird(#Alisa_12) :}
    on Enter =>
    {
        ? {: can(#Alisa_12, fly) :} >> @>log;
    }
}

returns:

<yes>

The query:

{: $z(#Alisa_12, $x) :}
Download
app PeaceKeeper
{
    {: can(bird, fly) :}
    {: bird(#Alisa_12) :}
    on Enter =>
    {
        ? {: $z(#Alisa_12, $x) :} >> @>log;
    }
}

returns:

<yes>
$z = can(bird,fly)

The relationship beween concepts '#Alisa_12' and 'fly' is set by inheritance, not by direct fact or rule.

Example 3

back to top

Inserts fact {: >: { bird (#1234) } :}

into main storage of current NPC and returns inserted fact into expression's stack. The fact is not displayed here.

Read more about operator "insert" here.

Read more about facts here.

Read more about logic rule here.

Download
app PeaceKeeper is [0.5] exampleClass
{
    on Enter =>
    {
        "Begin" >> @>log;
        insert {: >: { bird (#1234) } :};
        "End" >> @>log;
    }
}
Begin
End

Example 4

back to top

Download
app PeaceKeeper
{
    {: animal(cat) :}
    on Enter =>
    {
        select {: { cat is animal } :} >> @>log;
    }
}
<yes>
Download
app PeaceKeeper
{
    {: >: { animal(cat) } :}
    on Enter =>
    {
        select {: cat is animal :} >> @>log;
    }
}
<yes>
Download
app PeaceKeeper
{
    {: animal(cat) :}
    on Enter =>
    {
        select {: >: { cat is animal } :} >> @>log;
    }
}
<yes>

Example 5

back to top

Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, 15) :}
    on Enter =>
    {
        select {: age(#Tom, `teenager`) :} >> @>log;
    }
}
<yes>
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, 12) :}
    on Enter =>
    {
        select {: age(#Tom, very `teenager`) :} >> @>log;
    }
}
<yes>
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, 12) :}
    on Enter =>
    {
        select {: age(#Tom, very teenager) :} >> @>log;
    }
}
<yes>
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, 12) :}
    on Enter =>
    {
        select {: age(#Tom, `very` `teenager`) :} >> @>log;
    }
}
<yes>
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, very `teenager`) :}
    on Enter =>
    {
        select {: age(#Tom, 12) :} >> @>log;
    }
}
<yes>
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, `teenager`) :}
    on Enter =>
    {
        select {: age(#Tom, 12) :} >> @>log;
    }
}
<yes>

Example 6

back to top

Download
app PeaceKeeper
{
    {: >: {distance($x, $y)} -> { distance(I, $x, $y) } :}
    {: age(#Tom, 50) :}
    {: distance(I, #Tom, 12) :}
    on Enter =>
    {
        select {: age(#Tom, $x) & distance(#Tom, $y) & $x is not $y :} >> @>log;
    }
}
<yes>
$y = 12; $x = 50

Example 7

back to top

Download
app PeaceKeeper
{
    {: >: {distance($x, $y)} -> { distance(I, $x, $y) } :}
    {: distance(I, #Tom, 12) :}
    on Enter =>
    {
        select {: distance(#Tom, $x) & $x is 12 :} >> @>log;
    }
}
<yes>
$x = 12

Example 8

back to top

Download
app PeaceKeeper
{
    {: >: {distance($x, $y)} -> { distance(I, $x, $y) } :}
    {: distance(I, #Tom, 50) :}
    on Enter =>
    {
        select {: distance(#Tom, $x) & $x > 5 :} >> @>log;
    }
}
<yes>
$x = 50
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, 50) :}
    on Enter =>
    {
        select {: age(#Tom, $x) & $x > `teenager` :} >> @>log;
    }
}
<yes>
$x = 50
Download
linvar age for range (0, 150]
{
    constraints:
        for relation age;
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    {: age(#Tom, 50) :}
    on Enter =>
    {
        select {: age(#Tom, $x) & $x > very `teenager` :} >> @>log;
    }
}
<yes>
$x = 50

Example 9

back to top

Download
app PeaceKeeper
{
    {: >: {distance($x, $y)} -> { distance(I, $x, $y) } :}
    {: distance(I, #Tom, 50) :}
    on Enter =>
    {
        select {: distance(#Tom, $x) & $x >= 5 :} >> @>log;
    }
}
<yes>
$x = 50

Example 10

back to top

Download
app PeaceKeeper
{
    {: >: {distance($x, $y)} -> { distance(I, $x, $y) } :}
    {: distance(I, #Tom, 4) :}
    on Enter =>
    {
        select {: distance(#Tom, $x) & $x < 5 :} >> @>log;
    }
}
<yes>
$x = 4

Example 11

back to top

Download
app PeaceKeeper
{
    {: >: {distance($x, $y)} -> { distance(I, $x, $y) } :}
    {: distance(I, #Tom, 5) :}
    on Enter =>
    {
        select {: distance(#Tom, $x) & $x <= 5 :} >> @>log;
    }
}
<yes>
$x = 5

Example 12

back to top

Download
app PeaceKeeper
{
    {: barrel(#a) :}
    {: see(I, #a) :}
    on Enter =>
    {
        select {: see(I, $x) & barrel($x) & !focus(I, friend) :} >> @>log;
    }
}
<yes>
$x = #a

Imperative logic operators

back to top

Read more about Imperative logic operators here and here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 3;
        if(@a <= 0 | @a is 3 | @a > 5)
        {
            'Yes!' >> @>log;
            } else {
            'Else Yes!' >> @>log;
        }
        'End' >> @>log;
    }
}
Begin
Yes!
End
Download
linvar age for range (0, 150]
{
    terms:
        `teenager` = Trapezoid(10, 12, 17, 20);
}
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 16;
        if(@a <= teenager)
        {
            'Yes!' >> @>log;
            } else {
            'Else Yes!' >> @>log;
        }
        'End' >> @>log;
    }
}
Begin
Yes!
End

Arithmetic operators

back to top

Read more about Arithmetic operators here.

Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        1 + 1 >> @>log;
        'End' >> @>log;
    }
}
Begin
2
End
Download
app PeaceKeeper
{
    private:
    @a = 2;
    on Enter =>
    {
        @b = 3;
        'Begin' >> @>log;
        @a + @b >> @>log;
        'End' >> @>log;
    }
}
Begin
5
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        1 + NULL >> @>log;
        'End' >> @>log;
    }
}
Begin
NULL
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        1 + 'Hi' >> @>log;
        'End' >> @>log;
    }
}
Begin
1Hi
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        3 - 1 >> @>log;
        'End' >> @>log;
    }
}
Begin
2
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        3 * 4 >> @>log;
        'End' >> @>log;
    }
}
Begin
12
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        12 / 4 >> @>log;
        'End' >> @>log;
    }
}
Begin
3
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        12 / 0 >> @>log;
        'End' >> @>log;
    }
}
Begin
NULL
End
Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        (3 + 5) * 2 >> @>log;
        'End' >> @>log;
    }
}
Begin
16
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 2;
        2 * -@a >> @>log;
        'End' >> @>log;
    }
}
Begin
-4
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        @a = -2;
        2 * -@a >> @>log;
        'End' >> @>log;
    }
}
Begin
-4
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        @a = -2;
        2 * +@a >> @>log;
        'End' >> @>log;
    }
}
Begin
4
End
Download
app PeaceKeeper
{
    private:
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 2;
        2 * +@a >> @>log;
        'End' >> @>log;
    }
}
Begin
4
End

Operator "new"

back to top

Download
class class1
{
    @b = 1;
}
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = new class1;
        @a.@b >> @>log;
        'End' >> @>log;
    }
}
Begin
1
End
Download
class class1
{
    @b = 1;
}
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @c = class1;
        @a = new @c;
        @a.@b >> @>log;
        'End' >> @>log;
    }
}
Begin
1
End
Download
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
            @c = {
            @b = 1;
        };
        @a = new @c;
        @a.@b >> @>log;
        'End' >> @>log;
    }
}
Begin
1
End
Download
class class1
{
    @b = 1;
}
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        OtherFun(param: new class1);
        'End' >> @>log;
    }
    fun OtherFun(@param)
    {
        @param.@b >> @>log;
    }
}
Begin
1
End
Download
class cls0
{
    ctor(@param: string)
    {
        'Begin ctor of cls0' >> @>log;
        @param >> @>log;
        @b >> @>log;
        'End ctor of cls0' >> @>log;
    }
    private:
    @b = 0;
}
class cls1 is cls0
{
    ctor(@param: string)
    : cls0('Cool!')
    {
        'Begin ctor of cls1' >> @>log;
        @param >> @>log;
        @b >> @>log;
        'End ctor of cls1' >> @>log;
    }
    private:
    @b = 1;
}
app PeaceKeeper
{
    on Enter
    {
        'Begin' >> @>log;
        @a = new cls1('Hi!');
        @a.@b >> @>log;
        'End' >> @>log;
    }
}
Begin
Begin ctor of cls0
Cool!
0
End ctor of cls0
Begin ctor of cls1
Hi!
1
End ctor of cls1
1
End

Read more about "new" statement here.

Logic сonditional triggers

back to top

In this example trigger fires and writes "Logic condition fired!!!!" after insert fact.

In Unity scene facts are provided by perception channels.

Read more about Logic сonditional triggers here.

Download
app MyNPC
{
    {: barrel(#`Barel 1`) :}
    on Enter =>
    {
        "Begin" >> @>log;
        insert {: see(I, #`Barel 1`) :};
        "End" >> @>log;
    }
    on {: see(I, barrel) :} =>
    {
        "Logic condition fired!!!!" >> @>log;
    }
}
Begin
End
Logic condition fired!!!!
Download
app PeaceKeeper
{
    @a = #`gun 1`;
    on Enter =>
    {
        'Begin' >> @>log;
        insert {: see(I, @a) :};
    }
    on {: see(I, @a) :} =>
    {
        'D' >> @>log;
    }
}
Begin
D

This trigger binds captured in logic variable value with imperative variable.

Read more about binding variables here.

Download
app PeaceKeeper
{
    {: barrel(#a) :}
    {: see(I, #a) :}
    on {: see(I, $x) & barrel($x) & !focus(I, friend) :} ($x >> @x) =>
    {
        @x >> @>log;
    }
}
#a

"each" timer

back to top

Read more about "each" timer here.

Download
app PeaceKeeper
{
    on each 1
    {
        'Run!!!' >> @>log;
    }
}
Run!!!
Run!!!
Run!!!
Run!!!

"once" timer

back to top

Read more about "once" timer here.

Download
app PeaceKeeper
{
    on once 1
    {
        'Run!!!' >> @>log;
    }
}
Run!!!

Error handling

back to top

Read more about error handling here.

Download
app PeaceKeeper
{
    fun a(@param_1) =>
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
        error {: see(I, #a) :};
        'End of `a`' >> @>log;
    }
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            a(param_1: 1);
            'End' >> @>log;
        }
        catch
        {
            'catch' >> @>log;
        }
        catch(@e)
        {
            'catch(@e)' >> @>log;
            @e >> @>log;
        }
        catch(@e) where {: hit(enemy, I) :}
        {
            'catch(@e) where {: hit(enemy, I) :}' >> @>log;
        }
        catch(@e) where {: see(I, $x) :}
        {
            'catch(@e) where {: see(I, $x) :}' >> @>log;
            @e >> @>log;
        }
        else
        {
            'else' >> @>log;
        }
        ensure
        {
            'ensure' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
`a` has been called!
1
catch(@e) where {: see(I, $x) :}
ERROR {: #^`93666682-93fd-44bf-870a-2d3056703be4` >: { see(i,#a) } :}
ensure
End of `Enter`
Download
app PeaceKeeper
{
    fun a(@param_1) =>
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
        error {: see(I, #a) :};
        'End of `a`' >> @>log;
    }
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            a(param_1: 1);
            'End' >> @>log;
        }
        catch
        {
            'catch' >> @>log;
        }
        catch(@e)
        {
            'catch(@e)' >> @>log;
            @e >> @>log;
        }
        catch(@e) where {: hit(enemy, I) :}
        {
            'catch(@e) where {: hit(enemy, I) :}' >> @>log;
        }
        catch(@e) where {: see(I, $x) :}
        {
            'catch(@e) where {: see(I, $x) :}' >> @>log;
            @e >> @>log;
        }
        else
        {
            'else' >> @>log;
        }
        ensure
        {
            'ensure' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
    on {: see(I, $x) :} ($x >> @x) =>
    {
        'on Fired' >> @>log;
        @x >> @>log;
    }
}
Begin
`a` has been called!
1
catch(@e) where {: see(I, $x) :}
on Fired
ERROR {: #^`622a951d-b377-482a-b081-b227706ce6de` >: { see(i,#a) } :}
#a
ensure
End of `Enter`
Download
app PeaceKeeper
{
    fun a(@param_1) =>
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
        error {: see(I, #a) :};
        'End of `a`' >> @>log;
    }
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            a(param_1: 1);
            'End' >> @>log;
        }
        catch
        {
            'catch' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
`a` has been called!
1
catch
End of `Enter`
Download
app PeaceKeeper
{
    fun a(@param_1) =>
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
        error {: see(I, #a) :};
        'End of `a`' >> @>log;
    }
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            a(param_1: 1);
            'End' >> @>log;
        }
        catch
        {
            'catch' >> @>log;
        }
        else
        {
            'else' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
`a` has been called!
1
catch
End of `Enter`
Download
app PeaceKeeper
{
    fun a(@param_1) =>
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
        error {: see(I, #a) :};
        'End of `a`' >> @>log;
    }
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            a(param_1: 1);
            'End' >> @>log;
        }
        catch
        {
            'catch' >> @>log;
        }
        else
        {
            'else' >> @>log;
        }
        ensure
        {
            'ensure' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
`a` has been called!
1
catch
ensure
End of `Enter`
Download
app PeaceKeeper
{
    fun a(@param_1) =>
    {
        '`a` has been called!' >> @>log;
        @param_1 >> @>log;
        error {: see(I, #a) :};
        'End of `a`' >> @>log;
    }
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            a(param_1: 1);
            'End' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
`a` has been called!
1
End of `Enter`
Download
app PeaceKeeper
{
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            error {: see(I, #a) :};
            'End' >> @>log;
        }
        else
        {
            'else' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
End of `Enter`
Download
app PeaceKeeper
{
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            error {: see(I, #a) :};
            'End' >> @>log;
        }
        ensure
        {
            'ensure' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
ensure
End of `Enter`
Download
app PeaceKeeper
{
    on Enter =>
    {
        try
        {
            'Begin' >> @>log;
            error {: see(I, #a) :};
            'End' >> @>log;
        }
        else
        {
            'else' >> @>log;
        }
        ensure
        {
            'ensure' >> @>log;
        }
        'End of `Enter`' >> @>log;
    }
}
Begin
ensure
End of `Enter`

"repeat" statement

back to top

Read more about "repeat" statement here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 10;
        repeat
        {
            @a >> @>log;
            @a = @a - 1;
            if(@a > 5)
            {
                continue;
            }
            'End of while iteration' >> @>log;
            break;
        }
        'End' >> @>log;
    }
}
Begin
10
9
8
7
6
End of while iteration
End

"while" statement

back to top

Read more about "while" statement here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 10;
        while (@a > 0)
        {
            @a >> @>log;
            @a = @a - 1;
        }
        'End' >> @>log;
    }
}
Begin
10
9
8
7
6
5
4
3
2
1
End

"return" statement

back to top

Read more about "return" statement here.

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
        return;
        '`a` has been ended!' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a();
        'End' >> @>log;
    }
}
Begin
`a` has been called!
End
Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
        return;
        '`a` has been ended!' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a() >> @>log;
        'End' >> @>log;
    }
}
Begin
`a` has been called!
NULL
End
Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
        return 1;
        '`a` has been ended!' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        a() >> @>log;
        'End' >> @>log;
    }
}
Begin
`a` has been called!
1
End

"if-elif-else" statement

back to top

Read more about "if-elif-else" statement here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 1;
        if(@a)
        {
            'Yes!' >> @>log;
        }
        'End' >> @>log;
    }
}
Begin
Yes!
End
Download
app PeaceKeeper
{
    {: >: { see(I, #`Barel 1`) } :}
    on Enter =>
    {
        'Begin' >> @>log;
        if({: >: { see(I, #`Barel 1`) } :})
        {
            'Yes!' >> @>log;
        }
        'End' >> @>log;
    }
}
Begin
Yes!
End
Download
app PeaceKeeper
{
    {: >: { see(I, #`Barel 1`) } :}
    on Enter =>
    {
        'Begin' >> @>log;
        if({: >: { see(I, #`Barel 1`) } :})
        {
            'Yes!' >> @>log;
            } else {
            'Else Yes!' >> @>log;
        }
        'End' >> @>log;
    }
}
Begin
Yes!
End
Download
app PeaceKeeper
{
    {: >: { see(I, #`Barel 0`) } :}
    on Enter =>
    {
        'Begin' >> @>log;
        if({: >: { see(I, #`Barel 0`) } :})
        {
            'Yes!' >> @>log;
            } elif ({: >: { see(I, #`Barel 1`) } :}) {
            'Elif 1 Yes!' >> @>log;
        }
        'End' >> @>log;
    }
}
Begin
Yes!
End
Download
app PeaceKeeper
{
    {: >: { see(I, #`Barel 3`) } :}
    on Enter =>
    {
        'Begin' >> @>log;
        if({: >: { see(I, #`Barel 0`) } :})
        {
            'Yes!' >> @>log;
            } elif ({: >: { see(I, #`Barel 1`) } :}) {
            'Elif 1 Yes!' >> @>log;
            }elif ({: >: { see(I, #`Barel 2`) } :}) {
            'Elif 2 Yes!' >> @>log;
            }else{
            'Else Yes!' >> @>log;
        }
        'End' >> @>log;
    }
}
Begin
Else Yes!
End

"continue" loop statement

back to top

Read more about "continue" loop statement here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 10;
        repeat
        {
            @a >> @>log;
            @a = @a - 1;
            if(@a > 5)
            {
                continue;
            }
            'End of while iteration' >> @>log;
            break;
        }
        'End' >> @>log;
    }
}
Begin
10
9
8
7
6
End of while iteration
End

"break" loop statement

back to top

Read more about "break" loop statement here.

Download
app PeaceKeeper
{
    on Enter =>
    {
        'Begin' >> @>log;
        @a = 10;
        while (@a > 0)
        {
            @a >> @>log;
            @a = @a - 1;
            if(@a > 5)
            {
                break;
            }
        }
        'End' >> @>log;
    }
}
Begin
10
End

"exec" statement

back to top

Read more about "exec" statement here.

Download
app PeaceKeeper
{
        on Enter => {
        exec {: >: { direction($x1,#@{: >: { color($_,$x1) & place($_) & green($x1) } :}) & $x1 = go(someone,self) } o: 1 :};
    }
    fun go(@direction)
    {
        'go!!!!' >> @>log;
        @direction >> @>log;
    }
}
go!!!!
#@{: #^`3e55c913-f4fc-4102-ab67-4dab1d228207` >: { color($_,$x1) & place($_) & green($x1) } :}

"wait" statement

back to top

Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
    }
    on Enter =>
    {
        a~();
        wait 1;
    }
}
`a` has been called!
Download
app PeaceKeeper
{
    fun a() =>
    {
        '`a` has been called!' >> @>log;
        @a = 10;
        while (@a > 0)
        {
            @a >> @>log;
            @a = @a - 1;
        }
        'End `a`' >> @>log;
    }
    fun b() =>
    {
        '`b` has been called!' >> @>log;
        @a = 10;
        while (@a > 0)
        {
            @a >> @>log;
            @a = @a - 1;
        }
        'End `b`' >> @>log;
    }
    on Enter =>
    {
        'Begin' >> @>log;
        @a = a~();
        @b = b~();
        wait @a, @b;
        'End' >> @>log;
    }
}
Begin
`a` has been called!
`b` has been called!
10
10
9
9
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
End `b`
End `a`
End