シンタックスの柔軟性 — プログラミング言語 Ring 1.14 取扱説明書

Skip to content

# シンタックスの柔軟性

Ring コンパイラに標準装備されているシンタックスの柔軟性に関する選択肢です。

## キーワードの変更

ChangeRingKeyword 命令はキーワードを変更します。

注釈

共同プロジェクトのチーム間で記法の混用があるときは、キーワードの復元を心がけてください。

ちなみに

ChangeRingKeyword 命令は字句解析の段階でコンパイラにより実行されます (構文解析の前に)。

文法:

    ChangeRingKeyword  <旧キーワード>  <新キーワード>

用例:

    ChangeRingKeyword see print

    print "welcome" + nl

    ChangeRingKeyword print see

    see "Welcome" + nl

用例:

    ChangeRingKeyword  func function
    ChangeRingKeyword  see  print
    ChangeRingKeyword  ok   endif
    ChangeRingKeyword  next endfor
    ChangeRingKeyword  end  endwhile

    x = 10
    while x > 0
            print "x = " + x + nl
            for t = 1 to 10
                    if t = 3
                            print "number three" + nl
                    endif
            endfor

    x--
    endwhile

    test()

    function test
            print "message from test" + nl

    ChangeRingKeyword  function func
    ChangeRingKeyword  print see
    ChangeRingKeyword  endif ok
    ChangeRingKeyword  endfor next
    ChangeRingKeyword  endwhile end

## 演算子の変更

ChangeRingOperator 命令は演算子を変更します。

注釈

共同プロジェクトのチーム間で記法の混用があるときは、演算子の復元を心がけてください。

ちなみに

ChangeRingOperartor 命令は字句解析の段階でコンパイラにより実行されます (構文解析の前に)。

文法:

    ChangeRingOperator  <旧キーワード>  <新キーワード>

用例:

このプログラムは、 + 演算子を _+ へ変更することで隠します。

    changeringoperator + _+
    changeringkeyword SEE PRINT

    try
            print 5 + 10
    catch
            print nl print "error" print nl
    done

    changeringoperator _+ +

このプログラムは、 + 演算子を “plus” へ変更します。

    changeringoperator + plus
    changeringkeyword SEE PRINT

    Print 5 plus 5

    changeringoperator plus +
    changeringkeyword PRINT SEE

## シンタックスファイルの読み込み

複数のソースファイルから後で使用するために、ファイルへ ChangeRingKeyword と ChangeRingOperator 命令のグループを格納です。 これらのファイルは Load 命令で呼び出せません。理由として、

- ChangeRingKeyword および ChangeRingOperator 命令は字句解析の段階で、コンパイラにより実行されます (構文解析の前に)。

- Load 命令は構文解析の段階で実行されます (字句解析後の段階で)。

解決方法: LoadSyntax 命令を字句解析の段階で実行します。

文法:

    LoadSyntax      "syntaxfile.ring"

用例:

ファイル : StyleBasicOn.ring

    ChangeRingKeyword       see     print
    ChangeRingKeyword       ok      endif
    ChangeRingKeyword       next    endfor
    ChangeRingKeyword       end     endwhile

ファイル : StyleBasicOff.ring

    ChangeRingKeyword  print        see
    ChangeRingKeyword  endif        ok
    ChangeRingKeyword  endfor       next
    ChangeRingKeyword  endwhile     end

ファイル : UseStyleBasic.ring

    LoadSyntax "stylebasicon.ring"

    x = 10
    while x > 0
            print "x = " + x + nl
            for t = 1 to 10
                    if t = 3
                            print "number three" + nl
                    endif
            endfor
            x--
    endwhile

    LoadSyntax "stylebasicoff.ring"

    see "done" + nl

注釈

LoadSyntax 命令により呼び出されるファイルの内容は ChangeRingKeyword と ChangeRingOperator 命令のみ記述してください。

ちなみに

LoadSyntax により呼び出されたファイルは関数、パッケージおよびクラスには対応していません。命令型の命令のみ対応しています。

注釈

この機能により、同じプロジェクトで使用できる多種多様な記法を作成できます。また、 Ring の訳文では日本語、アラビア語、フランス語などの自然言語に対応できます。

ちなみに

LoadSyntax 命令の効果は、現在のソースコードに関連するものだけに限られます (ファイルスコープ)。

## 関数の引数を“()” で囲うには

関数の引数は“()”で囲います (オプション扱い)。

用例:

    hello()
    sum(3,4)

    func hello()
            see "Hello" + nl

    func sum(x,y)
            see x+y+nl

実行結果:

    Hello
    7

用例:

    myfunc = func x,y { see x + y + nl }

    call myfunc (3,4)

    myfunc2 = func (x,y) { see x+y+nl }

    call myfunc(3,4)

実行結果:

    7
    7

## ステートメントの末尾および間でセミコロンを使うには

Ring ではステートメントの末尾、および間でセミコロンを使えます (オプション扱い)。

用例:

    # セミコロンの使用はオプション扱いです。

    see "Hello" + nl ; see "How are you?" + nl  ; see "Welcome to Ring" + nl ;
    one() ; two() ; three() ;
    func one ; see "one" + nl ;
    func two ; see "two" + nl ;
    func three ; see "three" + nl ;

実行結果:

    Hello
    How are you?
    Welcome to Ring
    one
    two
    three

## 変数名に $ と @ を使うには

変数名には Unicode 文字に加えて $ と @ も使えます。

この機能は便利です。例えば、グローバル変数は $ で、そしてオブジェクトの属性は @ で書き始められます。

これは Ruby などでは規則ですが、 Ring ではコンパイラへ影響を及ぼさないオプション扱いのものです。

用例:

    $global_variable = 5

    new test { hello() }

    class test

            @instance_variable = 10

            func hello

                    local_variable = 15

                    see "Global   : " + $global_variable + nl +
                        "Instance : " + @instance_variable + nl +
                        "Local    : " + local_variable + nl

実行結果:

    Global   : 5
    Instance : 10
    Local    : 15

## If ステートメントで‘but’の代わりに‘elseif’キーワードを使うには

If ステートメントで‘but’を使いたくないときは、 ‘elseif’キーワードへ変更できます。

用例:

    give x
    if x = 1 see "one"
    elseif x=2 see "two"
    elseif x=3 see "three"
    elseif x=4 see "four"
    else see "other"
    ok
    see nl

## Switch ステートメントで‘other’の代わりに‘else’キーワードを使うには

Switch ステートメントで‘other’を使いたくないときは、 ‘else’キーワードへ変更できます。

また If ステートメントで‘else’を‘other’キーワードへ置き換えることもできます。

つまり‘other’キーワードは‘else’キーワードと同じ扱いです。

用例:

    x = 1
    switch x
            on 10
                    see "10" + nl
            else
                    see "not 10" + nl
    end

実行結果:

    not 10

## 制御構造で‘end’キーワードを使うには

‘end’ キーワードは制御構造を閉じます。

- If ステートメント

- For ループ

- Switch

- While

- Try ～ Catch

用例:

    see "if statement.." + nl
    x = 1
    if x = 1
            see "one" + nl
    elseif x=2
            see "two" + nl
    elseif x=3
            see "three" + nl
    end
    see "for loop.." + nl
    for t = 1 to 10
            see t
    end
    see nl
    see "switch..." + nl
    x = 1

    switch x
            on 1 see "one" + nl
            on 2 see "two" + nl
    end

    see "try catch..." + nl
    try
            x = 1 / 0
    catch
            see "catching error" + nl
    end

実行結果:

    if statement..
    one
    for loop..
    12345678910
    switch...
    one
    try catch...
    catching error

## 制御構造の開始と終了で括弧 { } を使うには

制御構造の開始と終了で括弧 { } を使えます。

- If ステートメント

- For ループ

- Switch

- While

- Try ～ Catch

用例:

    see "if statement.." + nl
    x = 1
    if x = 1 {
            see "one" + nl
    elseif x=2
            see "two" + nl
    elseif x=3
            see "three" + nl
    }
    see "for loop.." + nl
    for t = 1 to 10 {
            see t
    }
    see nl
    see "switch..." + nl
    x = 1

    switch x {
            on 1 see "one" + nl
            on 2 see "two" + nl
    }

    see "try catch..." + nl
    try {
            x = 1 / 0
    catch
            see "catching error" + nl
    }

実行結果:

    if statement..
    one
    for loop..
    12345678910
    switch...
    one
    try catch...
    catching error

## ‘see’と‘give’ の代わりに‘put’と‘get’を使うには

‘see’キーワードを‘put’キーワードへ置き換えられます。

また‘give’キーワードを‘get’キーワードへ置き換えることもできます。

用例:

    put "Hello World" + nl
    put "Enter Your Name ? " Get Name
    Put "Hello " + Name

## Switch ステートメントで‘on’の代わりに‘case’を使うには

Switch ステートメントで‘on’キーワードを‘case’キーワードへ置き換えられます。

用例① :

    for x=1 to 10
            switch x
            case 1 put "one" + nl
            case 2 put "two" + nl
            case 3 put "thre" + nl
            else put "else" + nl
            end
    end

用例② :

    for x=1 to 10 {
            switch x {
            case 1 put "one" + nl
            case 2 put "two" + nl
            case 3 put "thre" + nl
            else put "else" + nl
            }
    }

## 関数とメソッドの定義で‘func’の代わりに‘def’を使うには

関数、およびメソッドの定義で ‘func’ の代わりに ‘def’ キーワードを使えます。

用例:

    one() two()

    def one put "one" + nl
    def two put "two" + nl

## Package/Class/Function で括弧 { } を使うには

用例:

    load "stdlib.ring"

    import mypackage

    new myclass {
            myfunc()
    }

    package mypackage
    {
            class myclass
            {
                    func myfunc
                    {
                            print("Hello, World!\n")
                    }
            }
    }

## Package/Class/Function キーワードの後で‘end’を使うには

用例:

    import mypackage

    new myclass {
            myfunc()
    }

    package mypackage
            class myclass
                    def myfunc
                            put "Hello, World!"
                    end
            end
    end

## Package/Class/Function キーワードの後で‘endpackage’/’endclass’/’endfunc’を使うには

用例:

    import mypackage

    new myclass { myfunc() }

    package mypackage
            class myclass
                    func myfunc
                            see "welcome"  + nl
                    endfunc
            endclass
    endpackage

## キーワードの後にくる行を無視

Ring 1.8 からコンパイラは、キーワードの後に続く行をトークンとみなして無視するようになりました。

用例:

    see
    "
            Hello, World!
    "
    test()

    func
    #======================#
            Test
    #======================#

            ?
            "

            Hello from the Test function

            "

実行結果:

    Hello, World!

    Hello from the Test function