Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ленивые вычисления


RWolf ©   (2010-01-05 17:40:00) 

Допустим, нужно вывести в лог строчку, если установлен флаг отладки.
Конструкция вида if DebugFlag then WriteLog(s) загромождает исходники, поэтому пишем процедуру
procedure Debug(const s:string);
begin
 if DebugFlag then WriteLog(s)
end;

Всё бы хорошо, но теперь s вычисляется всегда, независимо от значения DebugFlag — лишняя загрузка CPU.
Есть ли простая в плане читаемости синтаксическая конструкция вроде вышеупомянутого вызова процедуры Debug, чтобы передаваемая в неё строка вычислялась в зависимости от условия?
скажем, в Си можно было бы просто определить макрос
#define DEBUG(...) if (DebugFlag) printf(__VA_ARGS__)


RWolf   (2010-01-05 18:59:00) [1]


> grammar-nazi   (05.01.10 18:14) [4]

> как это согласовывается с
> #define DEBUG(...) if (DebugFlag) printf(__VA_ARGS__)


макрос DEBUG("x=%d\n", x) развернётся в if (DebugFlag) printf("x=%d\n", x)


Демо   (2010-01-05 18:28:00) [2]


> вот то, на что указывает ссылка, передаваемая в функцию,
>  и вычисляется.


Ну раз в рантайм, только конструкция if DefDebug then...


Кука съела ник   (2010-01-05 18:26:00) [3]


> Какая тут лишняя загрузка процессора?


DebugLog (Format('%s%s%s%s', ['aaa'+foo, 'bbb'+bar,'ccc'+bazz,'ddd'+blinch])


grammar-nazi   (2010-01-05 18:19:00) [4]

> Демо ©   (05.01.10 18:15) [5]
> Что значит "вычисляется"?
> В функцию передаётся ссылка - и всё.
> Какая тут лишняя загрузка процессора?

вот то, на что указывает ссылка, передаваемая в функцию, и вычисляется.


Демо   (2010-01-05 18:15:00) [5]


> Всё бы хорошо, но теперь s вычисляется всегда,


Что значит "вычисляется"?
В функцию передаётся ссылка - и всё.
Какая тут лишняя загрузка процессора?


grammar-nazi   (2010-01-05 18:14:00) [6]

> RWolf ©   (05.01.10 17:50) [2]
> речь не об условной компиляции, нужен именно runtime.

как это согласовывается с

> RWolf ©   (05.01.10 17:40)  
> скажем, в Си можно было бы просто определить макрос
> #define DEBUG(...) if (DebugFlag) printf(__VA_ARGS__)
?


Jeer   (2010-01-05 18:11:00) [7]

1. Если говорить о варианте дебаг/боевой - чем мешает IFDEF ?
2. Не вижу проблем в:
if gDebug then MyDebugLog(s);

В более современных версиях может что-то есть менее "загроможнающее".


RWolf   (2010-01-05 17:50:00) [8]

Jeer ©   (05.01.10 17:49) [1]
речь не об условной компиляции, нужен именно runtime.


Jeer   (2010-01-05 17:49:00) [9]

Т.е. посмотреть/почитать о {$IFDEF whoiswho}.. {$ELSE}.. {$ENDIF} не судьба ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо