BUG: incorrect lambda closure
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 停滞
- 技術スタック
- javascript, python
- 領域
- compilers
調査の方向性
Start with the Python reproducer and compare its generated JavaScript, especially the lambda's intent and method bindings inside the loop. Trace the lambda translation and scope handling; done means the generated code preserves each iteration's captured values and the reproducer calls method_one successfully.
索引モデルが issue の本文から書いたものです。
説明
see javascript-closure-inside-loops
- the following code
def method_one(intent, *args):
print(f'method_one {intent}: {args}')
def method_two(intent, *args):
print(f'method_two {intent}: {args}')
config_list = [
('one', method_one),
('two', method_two),
]
method_dict = dict()
for intent, method in config_list:
print(f"intent={intent} method={method}")
method_dict[intent] = lambda *args, intent = intent, method = method : method(intent, args)
method_dict['one']()
- produces output in python:
intent=one method=<function method_one at 0x7f7cb7111830>
intent=two method=<function method_two at 0x7f7cb7139950>
method_one one: ((),)
- and produces error in javascript:
tester.py:28 Uncaught TypeError: method is not a function
- due to translation:
export var method_one = function (intent) {
var args = tuple ([].slice.apply (arguments).slice (1));
print ('method_one {}: {}'.format (intent, args));
};
export var method_two = function (intent) {
var args = tuple ([].slice.apply (arguments).slice (1));
print ('method_two {}: {}'.format (intent, args));
};
export var config_list = [tuple (['one', method_one]), tuple (['two', method_two])];
export var method_dict = dict ();
for (var [intent, method] of config_list) {
print ('intent={} method={}'.format (intent, method));
method_dict [intent] = (function __lambda__ () {
var intent = intent;
var method = method;
var args = tuple ([].slice.apply (arguments).slice (0));
return method (intent, args);
});
}
method_dict ['one'] ();
- where both
intentandmethodare undefined via incorrect lambda closure:
var intent = intent;
var method = method;
6 . and one way to transform is:
for (var [intent, method] of config_list) {
const intent_ = intent // const
const method_ = method // const
print ('intent={} method={}'.format (intent, method));
method_dict [intent] = (function __lambda__ () {
var intent = intent_;
var method = method_;
var args = tuple ([].slice.apply (arguments).slice (0));
return method (intent, args);
});
}
- 主要言語
- Python
- スター
- 2.9k
- フォーク
- 218
- PR マージ指標
- 30日以内にマージされた PR はありません
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
TranscryptOrg/Transcrypt のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
TranscryptOrg/Transcrypt#913 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
TranscryptOrg/Transcrypt#911 · コメント 2 件 ·
-
IS: bug
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
TranscryptOrg/Transcrypt#908 ·
-
SUB: documentation
難易度 1/5 1時間未満 初心者へのやさしさ 62/100
TranscryptOrg/Transcrypt#656 · コメント 7 件 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 76/100
TranscryptOrg/Transcrypt#914 ·
TranscryptOrg/Transcrypt の issue をすべて見る
似ている issue
-
link-check link-check:sphinx-theme
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
qgis/QGIS-Documentation#11275 ·
-
bug priority:normal ready-for-dev
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
OpenHands/extensions#626 · コメント 1 件 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
CSCfi/sd-search-api#39 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 90/100