stuncloud / UWSCR

UWSC互換スクリプト実行ツール
MIT License
47 stars 4 forks source link

replモードでスクリプトの再コール(再読み込み)の実装についてのご提案 #163

Open cocco84 opened 2 months ago

cocco84 commented 2 months ago

要望

要望の背景

replモードは大変便利でコーディング中のテスト等で活用しています。 その手順の中で

uwscr --repl
call hoge.uws
print fuga()    //1

のように

  1. hoge.uwsにfugaという関数を書く
  2. replでfuga()の動作を確認する
  3. hoge.uwsを修正する
  4. 再度replでfuga()の動作を確認する

というような事を行っています。

想定している出力結果にならない場合はhoge.uwsファイルを再編集して実行しますが、 現状のreplだと再コールしても同一の関数は再度呼び出されない(正確には読み込し直さない?)ので少し不便です。

要望

個人的にはrepl限定で動作する関数(そういうものができるのであれば)でよいのですが reloadのような関数・またはcallへのオプションを実装し、ファイルやモジュールの再読み込みを可能にすると コードのテストも楽になりそうなのですがいかがでしょうか。

使用としては以下のようなイメージです。

uwscr --repl
call hoge.uws
print fuga()      // 1
reload hoge.uws
print fuga()      // 2

補足用コード

No response

stuncloud commented 2 months ago

replでcallすることを想定していませんでした 確かにそのような使い方は面白いですね

repl実行中に限り、同一ファイルの再callで重複定義があればそれを上書きするというような実装が可能かどうか調査してみます 定義済みの関数をファイルから削除した場合に定義も消すというのは難しいですが、定義の上書きだけならできるかもしれません

もしそれが可能であればホットリロードもやれたらやりたいですね (repl起動時に読み込んだファイルの変更を検知して自動で取り込むような機能)

# module.uwsを読み込んだ状態で起動
PS> uwscr --repl module.uws
# module.uwsのhoge()を呼ぶ
uwscr> hoge()
1
# module.uwsを編集しhoge()の出力を2にする
# ファイル変更を検知してホットリロード処理
notice: reloaded module.uws
uwscr> hoge()
2
stuncloud commented 2 months ago

callに限らずreplでは関数やmoduleの再定義を可能とするのが良さそう (するとcall再読み込みでも定義が上書きされる)

uwscr> function foo()
     -     result = 1
     - fend
uwscr> foo()
1
uwscr> function foo()
     -     result = 2
     - fend
uwscr> foo()
2
uwscr>

実現可能かどうかの確認と、やるとしたらどこまで上書きを許可するかの検討は必要

stuncloud commented 2 months ago

1.0.1では対応せず 後日対応予定