EddyScript

EddyScriptは、Pythonに似た構文を持つプログラミング言語です。これは、Eddyの様々な部分で使用されます。この言語で書かれたものは、すべて固有のGPUコードにコンパイルされ、ハードウェア上で実行されます。

この言語の使用例は、Eddyに実装されているシェーダーのいずれかを開くことで確認することができます。それらはすべてこの言語で書かれています。

Pythonと多数の類似点がありますが、Pythonとはまったく異なります。型がどのように扱われるか、また、関数をどのように宣言する必要があるかを理解することは重要です。

以下は、EddyScriptではまだ同等の機能がないPython関数のリストです。

  • import statements
  • tuples
  • user defined classes/objects
  • strings
  • dictionaries
  • generators
  • context managers
  • nested functions
  • exceptions
  • list comprehensions
  • function *args and **kwargs
  • function named arguments
  • function optional arguments

この言語はまだ発展中で、今後のバージョンでは、おそらくこれらの関数のいくつかに対応するようになるでしょう。


基本型

説明

Int, int

32ビットの符号付き整数。

Int8, int8

8ビットの符号付き整数。

Int16, int16

16ビットの符号付き整数。

Int64, int64

64ビットの符号付き整数。

Float, float

単精度浮動小数。

Bool, bool

True/Falseを表すブール型。

None

無効。デフォルトの関数の戻り型。

ベクトル型

説明

Int2

2つのInt型の配列。

Int3

3つのInt型の配列。

Int4

4つのInt型の配列。

Float2

2つのFloat型の配列。

Float3

3つのFloat型の配列。

Float4

4つのFloat型の配列。

これらの型は、この例のように通常のリストとして扱うことができます。

def example(foo=Float3, bar=Float2):
    return foo[0] + bar[1]

以下は、整数のリストを、これらの型の1つを受け取る関数へどのように渡すかを示した例です。

def add_float3(a=Int3, b=Int3):
    return a+b

def example():
    return add_float3([1,1,1], [1,1,1])


ご注意

リストが対応するベクトル型と一致しない場合、コンパイルエラーが発生します。

マトリックス型

説明

Float3x3

3つのFloat3型の配列。

Float3x4

3つのFloat4型の配列。

Float4x4

4つのFloat4型の配列。


関数

関数の定義

  • 引数を必要とせず、戻り値のない関数は、このように定義されます。
def useless_function():
    pass
  • 現在、すべてのコードは関数内で書く必要があります。関数の定義から外れたグローバルスコープでは何も許可されません。
foo = 5 # ERROR, this is in global scope

def example():
    bar = 5 # OK

戻り型のルール

  • 関数にreturn文が含まれていない場合、コンパイラは自動的に戻り型をNoneと見なします。
def example_no_return_specified():
    pass # No return specified, compiler will assume 'return None'

def example_return_specified():
    return None
  • 複数のreturn文がある関数は、そのすべてが確実に同じ型を返すようにしなければなりません。
def multiple_return_example_BAD():
    a = 5
    if a < 5:
        return 1.0

    return [1.0, 2.0] # BAD, this does not match the type returned above which is a Float.

def multiple_return_example_GOOD():
    a = 5
    if a < 5:
        return 1.0

    return 0.0 # OK, both returns in this function are of the type Float
  • None以外のreturn文があり、それが条件ブロック内にある場合は、必ず最後のreturn文も指定してください。
# This will not compile
def single_return_example_BAD():
    a = 5
    if a < 5:
        return 1.0 # Function return is determined to be Float

    # The compiler automatically adds 'return None'
    # return None # BAD, 'None' is incompatible with 'Float'

# This is OK
def single_return_example_BAD():
    a = 5
    if a < 5:
        return None

    # The compiler automatically adds 'return None'
    # return None # OK, since the return earlier is also of type 'None'

関数の引数

  • すべての関数の引数は、型の割り当てや、型を得ることができる元のリテラルを必要とします。Pythonで引数をオプションとしてマークするのと同様の方法で、型を指定します。
# Function accepts two float arguments
def add_fn(a=Float, b=Float):
    return a + b

# Function accepts one float argument and one integer argument
def add_fn(a=1.0, b=10):    # Using literals to define the types
    return a + b

# Function accepts one float argument and one integer argument
def add_fn(a=Float, b=Int): # This is identical to the function defined above.
    return a + b

関数の呼び出し

  • 名前付き引数およびオプションの引数には対応していません。常に、それらが定義されている順序ですべての引数を関数に与える必要があります。
def add_fn(a=1.0, b=1.0):
    return a + b

def bad_example():
    return add_fn() # ERROR, you must provide add_fn with two arguments

def bad_example2():
    return add_fn(5.0, b=10.0) # ERROR, named arguments are not supported

def good_example():
    return add_fn(5.0, 10.0) # OK