シンタックスの柔軟性

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