erg/doc/JA/syntax/32_integration_with_Python.md
2022-08-11 18:30:32 +09:00

1.6 KiB

Pythonとの連携

Pythonから取り込んだオブジェクトはデフォルトですべてObject型になります。このままでは比較もできないので、型の絞り込みを行う必要があります。

標準ライブラリの型指定

Python標準ライブラリにあるAPIはすべてErg開発チームにより型が指定されています。

time = pyimport "time"
time.sleep! 1

ユーザースクリプトの型指定

Pythonのfooモジュールに型を付けるfoo.d.erファイルを作成します。 Python側でのtype hintは100%の保証にならないので無視されます。

# foo.py
X = ...
def bar(x):
    ...
def baz():
    ...
# foo.d.er
foo = pyimport "foo"
.X = declare foo.'X', Int
.bar = declare foo.'bar', Int -> Int
.baz! = declare foo.'baz', () => Int
foo = pyimport "foo"
assert foo.bar(1) in Int

これは、実行時に型チェックを行うことで型安全性を担保しています。declare関数は概ね以下のように動作します。

declare|S: Subroutine| sub!: S, T =
    # 実は、=>はブロックの副作用がなければ関数にキャストできる
    x =>
        assert x in T.Input
        y = sub!(x)
        assert y in T.Output
        y

これは実行時オーバーヘッドとなるので、PythonスクリプトをErgの型システムで静的に型解析するプロジェクトが計画されています。

Previous | Next