Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ホストが標準関数を上書きできるようにしたい #671

Open
FineArchs opened this issue May 16, 2024 · 6 comments
Open

ホストが標準関数を上書きできるようにしたい #671

FineArchs opened this issue May 16, 2024 · 6 comments

Comments

@FineArchs
Copy link
Member

this.vars = Object.fromEntries(Object.entries({
...consts,
...std,
...io,
}).map(([k, v]) => [k, Variable.const(v)]));

ここの...consts,を一番下にすればホストが同名の関数を提供することで既存の関数を上書きできるようになるはずなのでそうしたい

@syuilo
Copy link
Collaborator

syuilo commented May 17, 2024

上書きしたいのはなぜ?

@FineArchs
Copy link
Member Author

関数にバグやパフォーマンス上の問題があった時に自力救済ができるというのと、
ユースケース次第では一部の関数の使用を禁止したい場合があるかもしれないので、そういう場合にメッセージを出す関数で上書きするなどの処置が取れるといいかなと思っています

@uzmoi
Copy link
Member

uzmoi commented Aug 4, 2024

stdをデフォルトから分離して、ホスト側がプリセット的なものを選択してconstsと一緒にインタプリタに渡すようにしてもいいなと思いました。
使わないデフォルトの実装をtree-shakingで落とせるのと、#45 とかで信頼できる環境でだけデフォルト実装を使う関数とかが入ったときに、上書きし忘れとかアップデートで増えた新しい関数の上書きし忘れとかを防げるので。

@FineArchs
Copy link
Member Author

同パッケージ内でも、ファイルを分けてお互いに参照しない状態にすればtree-shakingは効きましたっけ?

@uzmoi
Copy link
Member

uzmoi commented Aug 5, 2024

ファイル分けてなくても変数が参照されていなければ効きますね。
例えば以下のようにすればstdPresetAllUnsafe:functionの実装は参照されていないので消えます。

// aiscript.ts
export const stdPresetSafe = {
  'Safe:function': FN_NATIVE(/* implements */),
};
export const stdPresetAll = {
  ...stdPresetSafe,
  'Unsafe:function': FN_NATIVE(/* implements */),
};

export class Interpreter {
  constructor(consts, options) {
    // ...
  }
  // ...
}

// host.ts
import { Interpleter, stdPresetSafe } from './aiscript';
const interpreter = new Interpreter(stdPresetSafe);

@uzmoi
Copy link
Member

uzmoi commented Aug 16, 2024

すいません、駄目な気がして試したらファイル分けてなくてもは嘘でした。
ファイル分けてれば効きます。
ファイル分けない場合は関数にすれば効きます。

export const stdPresetSafe = () => ({
  'Safe:function': FN_NATIVE(/* implements */),
});
export const stdPresetAll = () => ({
  ...stdPresetSafe(),
  'Unsafe:function': FN_NATIVE(/* implements */),
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants