Странность на мой взгляд в том, что строка %foo% будет подставлена не только в первом но и во втором случае.
Наверное это поведение логично и как-то объяснимо, но ни в одном из известных мне языков при обращении к переменной мы не получаем ее имя в качестве её значения при условии если её значение равно пустой строке.
Я не могу представить себе реальной пользы от такого поведения (кроме как для отладки).
Last edited by fps on Fri 20 Jul, 2018 11:09, edited 3 times in total.
fps wrote: ↑Fri 20 Jul, 2018 11:08
Странность на мой взгляд в том, что строка %foo% будет подставлена не только в первом но и во втором случае.
Нет, во втором случае всё будет правильно.
Другое дело, что Фар не сразу возьмёт новое значение.
После такого запуска Фар C:\Far3\far.exe "lua:win.SetEnv('myvar', win.GetEnv('myvar') or '')"
мы увидим %myvar% в приглашении, но если нажать Space Enter, %myvar% исчезнет и больше не появится.
При использовании цвета строка разрезается на части и эти части обрабатываются отдельно.
То есть, если переменная "выделена цветом" как у вас, то в ExpandEnvironmentStrings уходит только непосредственно "%myvar%", возвращается пустая строка, которая по
В windows полный бардак с получением строк через API. В некоторых случаях при успехе возвращается размер строки без завершающего нуля, при недостаточном размере буфера - размер с нулем, при ошибке - 0, в некоторых случаях возвращается TRUE/FALSE, а размер пропихивается через дополнительную переменную и может включать или не включать завершающий нуль в зависимости от религиозных убеждений разработчика, а в еще некоторых случаях вообще возвращается ошибка переполнения буфера без всяких подробностей. Обработка всего этого богатства, соответственно, бывает нетривиальна.
считалась "ошибкой" и на всякий случай заменялась обратно на "%myvar%".
Без цвета в ExpandEnvironmentStrings уходит вся строка "%myvar%$p$g" целиком, заменяется на строку "$p$g" (которую сложно спутать с ошибкой) и получается ожидаемый результат.