1 (изменено: alexii, 2014-05-04 19:54:46)

Тема: CMD/BAT: Теоретический вопрос по enabledelayedexpansion

Как известно, команда SETLOCAL ENABLEDELAYEDEXPANSION включает так наз. режим "отложенного раскрытия переменных", то есть чтобы переменные, измененные внутри "скобок" (типа FOR … DO (вот тут) …) обновлялись бы именно в момент изменения, а не при выходе за "скобки" (при этом к переменным надо обращаться через восклицательный знак: !SomeVar!, а не через процент, как обычно) — это всё понятно. Но я в одном месте прочитал мельком, что включение этого режима не только хорошо (так как удобно), но и плохо, потому что в этом режиме "все переменные помещаются в стек". Разъясните, пожалуйста, что такое "стек" и почему плохо, что в него помещаются переменные?

2

Re: CMD/BAT: Теоретический вопрос по enabledelayedexpansion

Приведите ссылку на «одно место».

3

Re: CMD/BAT: Теоретический вопрос по enabledelayedexpansion

ссылка — там «К сожалению, и данный способ содержит недостаток, а именно, “двойной эффект”, и, кроме “включения” оператора “!”, сохраняет все переменные в стек (см. описание команд setlocal/endlocal далее).»

4

Re: CMD/BAT: Теоретический вопрос по enabledelayedexpansion

Ага. Ну, данной статье можно верить почти во всём. На самом деле не «обновлялись бы именно в момент изменения, а не при выходе за "скобки" », как у Вас, и не «проблема с раскрытием переменных только после выхода из самого внешнего оператора скобки», как в оригинале. Проблема как раз напротив, состоит в том, что переменные окружения, обрамлённые символами «%», раскрываются командным процессором до входа в скобки (точнее в момент входа). Именно потому мы «видим» вместо них то значение, которое было в них до входа в скобки.

Теперь именно по первому вопросу:

Но я в одном месте прочитал мельком, что включение этого режима не только хорошо (так как удобно), но и плохо, потому что в этом режиме "все переменные помещаются в стек". Разъясните, пожалуйста, что такое "стек" и почему плохо, что в него помещаются переменные?

Стек в данном случае организуется не отложенным раскрытием, а самой командой «setlocal». Ну, вот так реализовали. Вся «плохость» состоит только в этом.

Как это выглядит? Как обычный стек, FILO, «первым пришёл — последним ушёл». Кладётся на вершину стека по использованию команды setlocal, снимается по команде endlocal или завершению контекста текущего пакетного файла.

5

Re: CMD/BAT: Теоретический вопрос по enabledelayedexpansion

alexii пишет:

Стек в данном случае организуется не отложенным раскрытием, а самой командой «setlocal».

Да это я понял, что дело в «setlocal», я просто не понимаю, почему там в статье стек это "к сожалению". А без «setlocal» стек не используется что ли? Я вот щас что-то припоминаю, что бывает какое-то "переполнение стека" — может имеется в виду это? Я извиняюсь, если вопросы тупые, просто я не программист и очевидные для других моменты для меня бывают непонятны.

P.S. (извиняюсь, просто небольщой офф-топ, не мог удержаться :)) вообще, у меня слово "стек" ассоциируется с такими (если кто помнит) тупыми советскими программируемыми калькуляторами 1980-х годов, они программировались на идиотской, так называемой "обратной польской бесскобочной логике", там числа сначала загонялись в стек, а потом вводились команды. Я как ни бился башкой об стену, но так к этой "бесскобочности" привыкнуть не смог, так что слово "стек" вызывает у меня сугубо негативные эмоции :)

6

Re: CMD/BAT: Теоретический вопрос по enabledelayedexpansion

я просто не понимаю, почему там в статье стек это "к сожалению".

Возможно к тому, что нет возможности сделать это отдельно от «setlocal», а не про сам стек собственно.

P.S. (извиняюсь, просто небольщой офф-топ, не мог удержаться ) …

Да, это именно стек. В теории алгоритмов и в программировании стек является одним из важнейших инструментов. И на уровне машинной логики, и на уровне микропрограмм.

Для таких ЯВУ, как С и ему наследующие, стек является образующей технологией обработки функций — аргументы функций помещаются в стек в обратном порядке, что позволяет прозрачно использовать функции с переменным числом аргументов.

Есть даже такой потрясающий ЯВУ (ещё более «низкоуровневый», нежели С), как Forth (Форт (язык программирования) — Википедия), где вся идеология полностью построена на стеке и постфиксной записи.