PSet баг
-
q = "qwe" ; w = 'PSet("basglobal", "'+q+'", "12345");'; log(w); eval(w); log([[GLOBAL:qwe]]);
криво работает.
Вывод в лог(w): PSet("basglobal", "qwe", "12345");
Вывод в лог([[GLOBAL:qwe]]): 12345
Отображение в диспетчере переменных: GLOBAL:'+q+': ""w = "asd" ; PSet("basglobal", w, "54321"); log([[GLOBAL:asd]]);
Лог: 54321
Отображения нет.
проект: 0_1519473541442_qweqweqwe.xml
-
@artihorror Я заметил, что вообще часто, когда определяешь через выполнить в диспетчере undefined. Сегодня тоже ладу дать не мог, ассоциативный массив, не показывало и через экшен лог тоже не выводило, а через выполнить и функцию log выводит.
-
@artihorror @Denis_krsk Думаю, что это не баг, а отсутствие доков. Дело в том, что, хотя для любого проекта и генерируется скрипт, похожий на просто JavaScript, этот скрипт потом при исполнении еще "допиливается" парсером. И уже исполняется допиленный код.
Парсер этот довольно просто устроен и заточен искать определенные подстроки и заменять их по определенным правилам. А другие правила говорят, что надо некий кусок кода перенести как есть. Видимо, здесь так и происходит.
Вывод: в Выполнить код можно писать свой код, но не любой. Надо быть осторожным с использованием функций и конструкций BAS.
Бонус для тру профи: все "опасные" места можно просмотреть, если в гитхабе BAS поискать по строке "regex" ))
-
@daemons на гитхабе таренкая версия лежит. да и тут точно такой же код как и в установке глобальной переменной, только ее имя заменено на переменную. код отрабатывает, а вот отображение отсутствует. в случае с эвалем все должно работать совсем без проблем, но все же
-
@artihorror Вы, видно, не утрудились вникнуть в мой ответ.
Разжевать? Вот фрагмент кода парсера, который извлекает имена глобальных переменных:
std::regex pieces_regex("PSet\\(\\s*\\\"basglobal\\\"\\s*\\,\\s*(\\\"[^\\\"]+\\\")");
Если убрать лес экранирующих символов, то получим:
PSet\(\s*"basglobal"\s*\,\s*("[^"]+")
Регексы читать умеете? Этот регекс даже не читает всю строку, где находится PSet. Его задача - вытащить имя переменной с помощью подгруппы в конце:
("[^"]+")
Что будет, если применить всё это к вашему:
w = 'PSet("basglobal", "'+q+'", "12345");';
?
Правильно:'+q+'
Для тех, кто в танке. BAS ожидает, что в скрипте всё, что относится к PSet, будет только в виде:
PSet("basglobal", "NAME", val)
То, что версия в гитхабе августовская - нерелевантно. Лично я из того, что мне было нужно, не нашел только часть с Node.js. Остальное в последней версии работает в полном соответствии с исходниками с гитхаба.
-
В качестве заключения добавлю, что править скрипты и использовать "Выполнить код", конечно, можно, в том числе и с PSet. Но умеючи и понимаючи.
Если вы в силу квалификации не можете или просто не взяли на себя труд провести своё исследование, то в следующий раз хотя бы поставьте знак вопроса в конце названия подобной темы. Пример:
PSet: баг?