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

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

Open
kujirahand opened this issue Apr 8, 2024 · 6 comments
Open

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

kujirahand opened this issue Apr 8, 2024 · 6 comments
Labels

Comments

@kujirahand
Copy link
Owner

kujirahand commented Apr 8, 2024

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

変数 constructor = 0

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

@weyk
Copy link
Contributor

weyk commented Apr 12, 2024

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

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

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

@kujirahand
Copy link
Owner Author

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

@kujirahand
Copy link
Owner Author

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

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

@kujirahand kujirahand changed the title 変数constructorが定義できない なでしこの変数管理をObjectからMapに変更する Apr 29, 2024
@weyk
Copy link
Contributor

weyk commented Apr 30, 2024

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

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

@kujirahand
Copy link
Owner Author

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

#1647

@kujirahand
Copy link
Owner Author

kujirahand commented May 1, 2024

ちなみに、以下のコードでだいたい単純置換できますが、何点か文法エラーがでますので、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]を置換します。

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

No branches or pull requests

2 participants