kujirahand / nadesiko3

Japanese Programming Language Nadesiko v3 (JavaScript/TypeScript)
https://nadesi.com/
MIT License
240 stars 19 forks source link

なでしこの変数管理をObjectからMapに変更する #1638

Open kujirahand opened 6 months ago

kujirahand commented 6 months ago

変数constructorが定義できない問題。

変数 constructor = 0

[エラー][文法エラー]main.nako3(1行目): 構文解析でエラー。『変数』の使い方が間違っています。

weyk commented 6 months ago

lex/parse中の変数管理域となるlocalvarsをobjectからMapに変更するとグローバル変数として 使えるようになります(namespaceが付くので実行時は問題ない。確認済) ローカル変数はlocalsや__varsに退避するケースがあるのでそちらもMapへの変更が必要そうです(未確認) 退避が不要なケースでは、var constructorにて変数が確保されてそのまま動きます(確認済)

使用不可と明示してエラーメッセージも予約語によるエラーにするのも一案です。

objectを使う「なんちゃってハッシュマップ」は割と問題が潜んでいるかもしれません。

kujirahand commented 5 months ago

@weyk さん、そろそろ、Mapに変更するときが来たのかもしれませんね。 今から変更に挑戦します。

kujirahand commented 5 months ago

https://github.com/kujirahand/nadesiko3core/issues/152 にて作業します。 相当な書き換えが発生することになり、細かい点で互換性が損なわれます。 プラグイン内部もかなり書き換えが必要になります。

JavaScriptのMap、Objetctと互換性が低すぎ…

weyk commented 5 months ago

ObjectはMap(HashMap)のためのものではないですからね。

Plugin向けAPIに必要APIバージョンのようなものを設けて ・set/getのメソッドを定義したObject("set"/"get"も使えなくなっちゃいますが) ・本物のMap のいずれかにコンパイルオプション的に切り替わるようにするのと、 ・___varlistへのアクセスを代替できるplugin向けAPIを提供・利用する。 が必要でしょうか。API経由は遅くなりそうなので、API準拠のpluginなのか 直接アクセスをする(バージョン間互換が低い)Pluginなのかも属性とて持つのも良さそうです。 「!取り込む」の解決によってコンパイルオプションが切り替わるとうな動作が 可能かどうかで対応可能な範囲は変わりそうです。

kujirahand commented 5 months ago

@weyk そうですよね。互換性に配慮したバージョン管理の機構があっても良いですね。以前、meta要素を付けていましたが、今のところなくても良い感じなので、この辺り整備しても良いですね。この点、以下で対処しようと思います。

https://github.com/kujirahand/nadesiko3/issues/1647

kujirahand commented 5 months ago

ちなみに、以下のコードでだいたい単純置換できますが、何点か文法エラーがでますので、npm run tscでTypeScriptの文法チェッカーで微修正すると素早く修正できます。

<?php

$SRC_DIR = './src';
$files = glob($SRC_DIR . '/*.mts');
foreach ($files as $file) {
  echo "file: $file\n";
  $content = file_get_contents($file);
  $lines = explode("\n", $content);
  $new_lines = [];
  foreach ($lines as $line) {
    $line2 = preg_replace('#__v0\[(.+?)\] = (.+)#', '__setSysVar($1, $2)', $line);
    if ($line != $line2) {
      echo "+ $line2\n";
      $new_lines[] = $line2;
      continue;
    }
    $line2 = preg_replace('#__v0\[(.+?)\]#', '__getSysVar($1)', $line);
    if ($line != $line2) {
      echo "- $line2\n";
      $new_lines[] = $line2;
      continue;
    }]
    $new_lines[] = $line;
  }
  // save
  $new_content = implode("\n", $new_lines);
  file_put_contents($file, $new_content);
}

あ、上記だけではだめで、__varslist[0]、[1]、[2]を置換します。