3.8 KiB
技術的なFAQ
本項はErg言語を使用する上での技術的な質問に答えるものです。すなわち、WhatやWhichで始まる質問、Yes/Noで答えられる質問を載せています。
根本的な文法の決定経緯についてはこちらを、なぜこの言語を作ったのか、この機能はどのように実装されているのかなど、より大きな話題はこちらを参照してください。
Ergに例外機構はないのですか?
A: ありません。Ergでは代わりにResult
型を使います。なぜErgに例外機構がないのかはこちらを参照してください。
ErgにはTypeScriptのAnyに相当する型はないのですか?
A: ありません。すべてのオブジェクトは少なくともObject
クラスに属しますが、この型は最小限の属性を提供するのみの型で、Anyのように好き放題はできません。
Object
クラスはmatch
などによる動的検査を通し目的の型に変換して使用します。JavaなどのObject
と同じ類です。
Ergの世界では、TypeScriptのようにAPIの定義を辿ったらAnyだったという絶望・混沌は生まれないのです。
Never, {}, None, (), NotImplemented, Ellipsisは何が違うのですか?
A: Never
は「起こりえない」型です。実行時エラーを出すサブルーチンが、Never
(またはNever
の合併型)を戻り値型とします。これを検知するとプログラムはすぐさま停止します。Never
型は定義上すべての型のサブクラスでもありますが、Never
型オブジェクトは決してErgコード上に出現しませんし、生成もされません。{}
はNever
と等価です。
Ellipsis
は省略を表すオブジェクトで、Python由来です。
NotImplemented
もPython由来です。これは未実装を表すマーカーとして使われますが、Ergではエラーを出すtodo
関数の方を推奨します。
None
はNoneType
のインスタンスです。Option
型でよく使われます。
()
はユニット型であり、そのインスタンス自身でもあります。これはプロシージャの戻り値など「意味のない値」を返したいとき使われます。
なぜx = p!()
は有効なのにf() = p!()
はEffectErrorとなるのですか?
A: !
は副作用の産物につけるマーカーではなく、副作用を起こしうるオブジェクトに付けるマーカーだからです。
プロシージャp!
や可変型T!
は副作用を起こす可能性がありますが、例えばp!()
の戻り値がInt
型だった場合、それ自体はもう副作用を起こしません。
PythonのAPIを使用しようとしたとき、Pythonでは有効だったコードがErgでは型エラーになりました。これはどういうことですか?
A: ErgのAPIはなるべくPythonのAPIの仕様に忠実に型付けられていますが、どうしても表現しきれないケースもあります。 また、仕様上有効でも望ましくないと判断した入力(例えば、intを入力すべきところでfloatを入力してもよい仕様など)は、Erg開発チームの判断により型エラーとする可能性があります。