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: баг?
    

Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.