パッケージの利用者がインタプリタのScopeを直接操作できないようにAPIを変更したいです。
現在、Scopeクラスがパッケージ外にエクスポートされており、
また、Interpreterのscopeプロパティがpublicとなっています。
これによって、スクリプトの実行中であっても、
パッケージ利用者がグローバル変数の操作(get(), exists(), getAll(), add(), assign())をすることが可能となっています。
また、optsプロパティの関数log(), onUpdated()により、変数の更新をリアルタイムに受け取れるようになっています。
将来、Scopeクラスには多くの変更が加わり、APIの後方互換性を維持するのが難しくなると考えています。
そこで、次のメジャーバージョンでは将来の変更に備え、ScopeクラスとInterperter#scopeの実装を隠蔽し、変数操作を以下に限定したいです。
(WebAssembly版InterpreterやWeb worker版Interpreterを実装するなら、ここでのInterpreterはインターフェースになって、ファクトリインターフェースも作ることになるかも)
Interpreterインスタンス化でのconsts引数による変数初期化
- 実行メソッド
exec()の返値による変数読み出し
メソッドシグネチャのイメージ:
public async exec(script?: Ast.Node[]): Promise<void>;
public async exec(script: Ast.Node[], opts: { returnVariables?: false }): Promise<void>;
/** `returnVariables` が `true` の場合は全ての変数、`string[]` の場合は配列に含まれる名前をもつ変数のみを返す */
public async exec(script: Ast.Node[], opts: { returnVariables: true | string[] }): Promise<Map<string, Value>>;
onUpdated()をInterpreterコンストラクタのoptsに追加し、log()やonUpdate()はoptsで指定された場合のみ有効化
パッケージの利用者がインタプリタの
Scopeを直接操作できないようにAPIを変更したいです。現在、
Scopeクラスがパッケージ外にエクスポートされており、また、
Interpreterのscopeプロパティがpublicとなっています。これによって、スクリプトの実行中であっても、
パッケージ利用者がグローバル変数の操作(
get(),exists(),getAll(),add(),assign())をすることが可能となっています。また、
optsプロパティの関数log(),onUpdated()により、変数の更新をリアルタイムに受け取れるようになっています。将来、
Scopeクラスには多くの変更が加わり、APIの後方互換性を維持するのが難しくなると考えています。そこで、次のメジャーバージョンでは将来の変更に備え、
ScopeクラスとInterperter#scopeの実装を隠蔽し、変数操作を以下に限定したいです。(WebAssembly版
InterpreterやWeb worker版Interpreterを実装するなら、ここでのInterpreterはインターフェースになって、ファクトリインターフェースも作ることになるかも)Interpreterインスタンス化でのconsts引数による変数初期化exec()の返値による変数読み出しメソッドシグネチャのイメージ:
onUpdated()をInterpreterコンストラクタのoptsに追加し、log()やonUpdate()はoptsで指定された場合のみ有効化