aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

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

Open FineArchs opened this issue 1 year ago • 6 comments

https://github.com/aiscript-dev/aiscript/blob/38f36ef2cef10ecc7620db9f0f3d46c92d23abc6/src/interpreter/index.ts#L50-L54 ここの...consts,を一番下にすればホストが同名の関数を提供することで既存の関数を上書きできるようになるはずなのでそうしたい

FineArchs avatar May 16 '24 12:05 FineArchs

上書きしたいのはなぜ?

syuilo avatar May 17 '24 07:05 syuilo

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

FineArchs avatar May 17 '24 08:05 FineArchs

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

uzmoi avatar Aug 04 '24 14:08 uzmoi

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

FineArchs avatar Aug 04 '24 23:08 FineArchs

ファイル分けてなくても変数が参照されていなければ効きますね。 例えば以下のようにすれば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 avatar Aug 05 '24 03:08 uzmoi

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

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

uzmoi avatar Aug 16 '24 18:08 uzmoi